原文链接:深入浅出@property 与 @synthesis
@property
@property我们都是十分熟悉的,这条语句编译器会自动合成(auto synthesis)这样几个东西添加到类中:
- 实例变量
- 存取方法
- 属性名
我们不要忽略了属性名(无_) 和实例变量名(有_)的特性
直接看这个:
@interface JZZPerson : NSObject
@property (nonatomic, copy) NSString *name;
@end
编译器就会自动生成这些:
key | value |
---|---|
instanceVariableName | _name |
propertyName | name |
getter | name() |
setter | setName:(NSString*)name |
此时的JZZPerson中有这些东西:
- OBJC_IVAR_ JZZPerson name (OBJC_IVAR_ 类名 属性名称)
- setter 和 getter方法对应的实现
- ivar_list : 成员实例变量列表
- method_list : 方法列表
- prop_list : 属性列表
也就是说如果我们添加一个age属性:
@interface JZZPerson : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *age;
@end
- ivar_list会增加一个_age
- prop_list会增加一个age
- method_list会增加setter和getter方法的描述
- 增加age的setter和getter的实现
@synthesis
synthesis意为合成,可以用来自定义实例变量(ivar)的名称
官方语法:
@implement YourClass
@synthesize propertyName = instanceVariableName;
...
@end
注意我们这里用的是propertyName
例如我们的JZZPerson中
@implement JZZPerson
@synthesize name = _JZZName;
@end
这样就会生成_JZZName实例变量,
那么以后我们访问name就不能用_name,而是用_JZZName,
但是我们的getter和setter还是name()和setName:(NSString *)name。虽然有人不喜欢下划线开头的实例变量名,但是笔者还是推荐默认的命名方案,毕竟大家都这样用。
注意,如果你的@synthesis后跟实例变量名在原来的类中不存在,如
@synthesize sex;
那么就会生成一个sex属性名和sex实例变量名(即名称相同且不带下划线)。