黑马程序员——OC基础—核心语法(下)
2014-10-19 22:05
477 查看
------- android培训、ios培训、期待与您交流! ----------
=====点语法 =====
点语法方法的本质是方法调用。当使用点语法时,编译器会自动展开成相应的方法。
比如:
stu.age = 10;
系统遇到上面这句语法的时候,会自动转成下面的语法。
[stu setAge:10];
int age = stu.age;
系统遇到上面这句语法的时候,会自动转成下面的语法。
int age = [stu age];
# 为什么会有点语法
1>简化代码,使编写代码简单。2>其他很多编译器都具有点语法,Xcode为了让别的程序员能快速熟悉编译器,而推出的点语法。
#点语法使用注意
避免死循环- (viod)setAge:(int)age { //_age = age NSLog(@"setAge"); self.age = age // 相当于 [self setAge:age]; }
这个会陷入死循环
- (int)age { NSLog(@"age"); return self.age; // 相当于调用了[self age]; }
这样同样会陷入死循环
=====@property =====
可以快速生成set与get方法,省去低级代码的工作量。声明格式:
@property 类型名称 成员变量; . . .
@property int age;
就等于
- (void)setAge:(int)age;
-(int)age;
这样可以省去我们很多时间。
当然也可以一次声明多个成员变量
@property int age;no;
这样就一次生成两个成员变量的set与get
但是一般分开写,为了代码的可读性高。
=====@snythesize =====
与@property对应,当声明好成员变量的set与get后,会自动生成与之对应的实现。@snythesize age = _age //会生成age的get,并且会访问_age这个成员变量
上面这行代码就等于:
-(int)age
{
return _age;
}
简单写法:
@snythesize age ; // 默认会访问age这个成员变量,如果没有,系统会自动生成@private类型的age变量
注意:@property语法在后面会自动生成set与get的实现,取代了@snythesize语法,而且,系统会优先选择用户自己的声明与实现,如果用户自己没有声明或者实现,系统才会自动生成。
===== 分类 Category =====
比如我们已经有一个Person类, 有它定义的方法. 我们想给Person类新加一些方法, 但是要求不能修改Person类 (Person.h和Person.m文件).一种方法是使用继承新建一个子类, 就可以包含Person类的所有方法并添加新的方法.
另一种方法是使用分类, 不需要新建类, 也可以扩充类的方法.
分类有利于团队开发。
一个类可以有很多个分类. 每个分类都可以给它添加不同的方法.
# 分类的声明与实现
分类分为声明和实现, 分别写在.h和.m文件中. 在Xcode中新建文件, 选择OC Category, 输入分类名称(一般以模块命名, 有时也以开发者命名),选择是哪个类的分类(比如Person).分类的声明
#import "Person.h" // 需要引用主类, 可以调用主类的方法 (比如属性的set/get方法) @interface Person(MJ) // 分类用 (小括号) 表示 - (void) study; @end
分类的实现
#import "Person+MJ.h" // 分类文件的文件名默认为 主类名+分类名 @implementation Person(MJ) - (void) study { NSLog(@"Person is studying. "); } @end
分类的使用
#import <Foundation/Foundation.h> #import "Person.h" // 包含主类文件 #import "Person+MJ.h" // 包含分类文件 int main() { Person *p = [[Person alloc] init]; [p study]; // 可以对这个类的对象调用分类中的方法 return 0; }
注意:
1> 只能增加方法, 不能增加成员变量. 如果需要增加成员变量, 可以考虑创建子类继承.2> 分类的实现中可以访问主类的成员变量.
3> 分类可以重写主类的方法, 但是不建议使用. 如果分类中有和原类中同名的方法, 会覆盖原类的方法, 这样会导致主类的方法无法再被调用,不建议这么做.
注: 调用方法时, 会先在分类中寻找, 如果没有, 再到原类中寻找, 如果没有, 再到父类中寻找, 如果没有, 再到头文件中寻找.
4> 如果不同的分类中有同名的方法, 和编译的顺序有关, 会调用最后编译的分类中的这个方法. 在 Build Phases - Compile Sources 中可以查看.可以看到只编译.m源文件 (.c .cpp), .h文件不会被编译, 安装从上到下的顺序编译. 可以调整文件编译的顺序. 注意就算把主类放到分类的后面编译, 依然会调用最后编译的分类中的方法. (Link Binary with Libraries 是链接的框架, 就是命令行的 -framework
XXX, 可以添加其它框架,告诉Xcode哪些框架需要链接)
也就是说, 如果分类中有重名的方法, 会相互覆盖, 也会覆盖掉主类中同名的方法. 分类中不建议写同名的方法.
相关文章推荐
- 黑马程序员——OC基础---核心语法(id,构造方法,Category,description,SEL)
- 黑马程序员——OC基础—核心语法(上)
- 黑马程序员——OC基础---核心语法(点语法,成员变量的作用域,@property和@synthesize)
- 黑马程序员-iOS基础-Objective-C基础(四)OC开发技巧及核心语法(上)
- 黑马程序员--ios基础--oc--面向对象--核心语法
- 黑马程序员----OC基础--核心语法、关键字
- 黑马程序员—OC语言基础—核心语法小结
- 黑马程序员-IOS-OC基础-OC简介及基本语法
- 黑马程序员_OC之核心语法
- OC基础语法(四)---核心语法(2)
- 黑马程序员——OC核心语法3(分类、SEL、类本质等)
- 黑马程序员6 oc核心语法
- 黑马程序员——oc核心语法1
- 黑马程序员 _6 OC基础 set get语法与点语法
- 黑马程序员——OC语言核心语法
- 黑马程序员-OC的核心语法
- 黑马程序员——OC基础语法
- 黑马程序员_OC基础06_OC语法
- 黑马程序员 7 oc核心语法与内存管理初探
- 黑马程序员-IOS-OC基础-面向对象语法二