synthesize关键字的作用

2018-07-03  本文已影响3人  一双鱼jn

通常我们习惯于如下方式定义一个属性,并通过点语法来调用属性的gettersetter方法。有时当重写gettersetter方法时还会使用带下划线的同名实例变量_str。那么,gettersetter以及这个实例变量是哪里来的。

@property (nonatomic, strong) NSString *str

iOS6之后 llvm编译器引入property autosysthesis 属性自动合成。

也就是说property定义的属性会自动添加这样一行代码 @synthesize propertyName = _propertyName

这也就是为什么property属性可以用带下划线的属性

@synthesize propertyName = _propertyName
这行代码的作用是

  1. propertyName这个属性生成gettersetter方法。
  2. 同时生成一个带下划线前缀的实例变量。或者说给propertyName添加一个别名

什么时候会用到synthesize

当下面这些情况的时候,系统不会自动的进行属性合成。也就是不会自动的生成gettersetter方法也不会自动的生成带_的实例变量。而我们需要使用实例变量和相关方法的时候,就需要手动添加synthesize来合成实例变量。

  1. 同时重写getter和setter方法时,不会自动合成属性。当我们只重写其中一个的时候还是会进行属性自动合成的
  2. 重写了只读属性的getter方法时。即表示当重写了readonly属性的getter方法时,带_的实例变量需要我们手动通过synthesize来合成。
  3. 使用了@dynamic
  4. 协议中的属性
  5. category中的属性
  6. 重载的属性

下面来分别说明

协议中的属性

协议中定义了属性,协议中定义了属性其实也就是定义了该属性的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
上一篇 下一篇

猜你喜欢

热点阅读