【iOS】@property、@synthesize、@dynamic

@property、@synthesize、@dynamic经常看到并使用,但是三者有什么样的关系和区别呢?

@property

@propertyiOS6以后推出的关键词。它会自动合成成员变量,对应的两个修饰符分别是@synthesize@dynamic,如果@synthesize@dynamic都没写,那么默认的就是@syntheszie var = _var;

@synthesize的语义是如果你没有手动实现 setter 方法和 getter 方法,那么编译器会自动为你加上这两个方法。

例如,声明一个字符串类型名字叫title的属性:

1
@property (nonatomic, strong) NSString *title;

在属性声明后,编译器会自动在.h文件中生成titlesetget方法。

@synthesize

并且还会声明一个下划线开头的成员变量(_xxx)。

声明属性后的成员变量和属性是通过@synthesize关联的,如果有多个属性,用逗号分隔。

例如,声明title属性后,编译器在编译时默认在.m文件中添加下面的代码

1
@synthesize title = _title;

成员变量是供内部类使用的(当然也可以使用KVC访问)。成员变量可以指定名字,而非使用默认的属性名前面加下划线。

例如,把属性title的成员变量修改为dbTitle

1
@synthesize title = dbTitle;

这时候就无法访问_title了,而应该使用dbTitle作为成员变量使用。

如果我们重写了title属性的setget方法,编译器会使用我们自己定义的方法。

@dynamic

告诉编译器不自动生成setget方法,避免编译期间产生警告,方法一般由开发者自己实现。

@dynamic最常用的是在Core DataNSManagedObject中,因为setget方法会在运行时动态创建。