------- 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哪些框架需要链接)
也就是说, 如果分类中有重名的方法, 会相互覆盖, 也会覆盖掉主类中同名的方法. 分类中不建议写同名的方法.