深入浅出@property 与 @synthesis

原文链接:深入浅出@property 与 @synthesis

@property

@property我们都是十分熟悉的,这条语句编译器会自动合成(auto synthesis)这样几个东西添加到类中:

  • 实例变量
  • 存取方法
  • 属性名

我们不要忽略了属性名(无_) 和实例变量名(有_)的特性

直接看这个:

@interface JZZPerson : NSObject
@property (nonatomic, copy) NSString *name;
@end

编译器就会自动生成这些:

keyvalue
instanceVariableName_name
propertyNamename
gettername()
settersetName:(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实例变量名(即名称相同且不带下划线)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值