@property和@synthesize
首先从翻译来看: @property(翻译为:性质)和@synthesize(合成),是不是很像属性(声明)和实现?
1. @property
用在@inteface中
用来自动生成setter和getter方法的声明,
用@property int age;就可以代替下面的两行
- (void)setAge:(int)age; // setter - (int)age; // getter
2.@synthesize(只做了解)
用在@implementation中
用来自动生成setter和getter方法的实现,并且会访问成员变量
用@synthesize age = _age;就可以代替
- (int)age{ return _age; } - (void)setAge:(int)age{ _age = age; }
3. @synthesize的细节(只做了解)
-
@synthesize age = _age;
> setter和getter实现中会访问成员变量_age
> 如果成员变量_age不存在,就会自动生成一个@private的成员变量_age
-
@synthesize age; 不写age=age(就是默认这样)
>setter和getter实现中会访问成员变量age
>如果成员变量age不存在,就会自动生成一个@private的成员变量age
-
手动实现
>若手动实现了setter方法,编译器就只会自动生成getter方法
>若手动实现了getter方法,编译器就只会自动生成setter方法
>若同时手动实现了setter和getter方法,编译器就不会自动生成不存在的成员变量
4. @property新特性(哈哈,现在就用这个)
-
自从Xcode 4.x后,@property就独揽了@synthesize的功能。也就是说,@property可以同时生成setter和getter的声明和实现
-
默认情况下,自动生成setter和getter的声明和实现,并且会去访问下划线 _ 开头的成员变量
-
比如@property int age; 做了三件事(以后就这样写,不用@synthesize):
1)生成set和get方法的声明
2)生成带下划线_age成员变量(它生成的变量是私有的—private)
3)生成set和get方法的实现
缺点是:成员变量是私有的,子类方法中不能访问(只能添加 {。。int _age。。} 弄成 protected)