通常我们习惯于如下方式定义一个属性,并通过点语法来调用属性的getter
和setter
方法。有时当重写getter
或setter
方法时还会使用带下划线的同名实例变量_str
。那么,getter
和setter
以及这个实例变量是哪里来的。
@property (nonatomic, strong) NSString *str
iOS6之后 llvm编译器引入property autosysthesis
属性自动合成。
也就是说property
定义的属性会自动添加这样一行代码 @synthesize propertyName = _propertyName
这也就是为什么property
属性可以用带下划线的属性
@synthesize propertyName = _propertyName
这行代码的作用是
- 给
propertyName
这个属性生成getter
和setter
方法。 - 同时生成一个带下划线前缀的实例变量。或者说给
propertyName
添加一个别名
什么时候会用到synthesize
当下面这些情况的时候,系统不会自动的进行属性合成。也就是不会自动的生成getter
和setter
方法也不会自动的生成带_
的实例变量。而我们需要使用实例变量和相关方法的时候,就需要手动添加synthesize
来合成实例变量。
- 同时重写getter和setter方法时,不会自动合成属性。当我们只重写其中一个的时候还是会进行属性自动合成的
- 重写了只读属性的getter方法时。即表示当重写了
readonly
属性的getter
方法时,带_
的实例变量需要我们手动通过synthesize
来合成。 - 使用了
@dynamic
时 - 协议中的属性
- category中的属性
- 重载的属性
下面来分别说明
协议中的属性
协议中定义了属性,协议中定义了属性其实也就是定义了该属性的getter和setter方法,但是并没有该方法的实现。
所以在遵守该协议的类中应该实现对应的getter和setter方法。可以直接通过synthesize
关键字来自动生成。
@dynamic
用property
会自动的添加synthesize
,而synthesize
的作用是自动生成getter和setter,并且定义一个带下划线的实例变量
而 dynamic
关键字则会阻止自动生成getter和setter方法和生成变量
@interface model
@property (nonatomic, strong) NSString *str;
@end
@implementation
@dynamic str;
@end
网友评论