深入浅出@property 与 @synthesis

原文链接:深入浅出@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实例变量名(即名称相同且不带下划线)。

发布了89 篇原创文章 · 获赞 37 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/u012891055/article/details/51418208