@property、@synthesize、@dynamic
经常看到并使用,但是三者有什么样的关系和区别呢?
@property
@property
是iOS6以后推出的关键词。它会自动合成成员变量,对应的两个修饰符分别是@synthesize
和@dynamic
,如果@synthesize
和 @dynamic
都没写,那么默认的就是@syntheszie var = _var;
@synthesize
的语义是如果你没有手动实现 setter 方法和 getter 方法,那么编译器会自动为你加上这两个方法。
例如,声明一个字符串类型名字叫title的属性:
1 | @property (nonatomic, strong) NSString *title; |
在属性声明后,编译器会自动在.h
文件中生成title
的set
和get
方法。
@synthesize
并且还会声明一个下划线开头的成员变量(_xxx
)。
声明属性后的成员变量和属性是通过@synthesize
关联的,如果有多个属性,用逗号分隔。
例如,声明title
属性后,编译器在编译时默认在.m
文件中添加下面的代码
1 | @synthesize title = _title; |
成员变量是供内部类使用的(当然也可以使用KVC访问)。成员变量可以指定名字,而非使用默认的属性名前面加下划线。
例如,把属性title
的成员变量修改为dbTitle
:
1 | @synthesize title = dbTitle; |
这时候就无法访问_title了,而应该使用dbTitle作为成员变量使用。
如果我们重写了title
属性的set
和get
方法,编译器会使用我们自己定义的方法。
@dynamic
告诉编译器不自动生成set
和get
方法,避免编译期间产生警告,方法一般由开发者自己实现。
@dynamic
最常用的是在Core Data
的NSManagedObject
中,因为set
和get
方法会在运行时动态创建。