请稍侯

Objective-C中的@property、@synthesize以及@dynamic

05 December 2020

Objective-C中的@property、@synthesize以及@dynamic

解读

  • @property 的本质是实际上就是 ivar (实例变量) + 存取方法(getter + setter)。在属性定义完成后,编译器会自动生成该属性的 getter 和 setter 方法,这个过程就叫做自动合成。除了生成 getter 与 setter 方法,编译器还要自动向类中添加适当类型的实例变量,并且在属性名前面加下划线,以此做实例变量的名字;
  • @synthesize 的作用就是如果没有手动实现 getter 与 setter 方法,那么编译器就会自动加上这两个方法;
  • @dynamic 的作用就是告诉编译器,getter 与 setter 方法由用户自己实现,不自动生成。但对于 readonly 的属性只需要提供 getter 即可;
  • 这三个关键字都是用来修饰属性的,也就是说是要作用在属性本身或说是属性名上的。

总结

  • 如果没有写 @synthesize 和 @dynamic,那么编译默认的就是 @synthesize var = _var;
  • 如果加入了 @dynamic 的话,编译系统就不会自己生成 getter 和 setter 方法了,需要我们自己来实现;
  • 当使用@synthesize a=_a;,指定了成员变量的名称(指定为带下划线的a),就会生成指定的成员变量。如果代码中存在带下划线的 a,就不会在生成了;
  • 如果是@synthesize a;,还会生成一个名称为带下划线的 a 成员变量,也就是说如果没有指定成员变量的名称会自动生成一个属性同名的成员变量;
  • 在 category 中使用 @property 也是只会生成 getter 和 setter 方法的声明,如果要给 category 增加属性的实现,需要借助于运行时的两个函数:objc_setAssociatedObjectobjc_getAssociatedObject
  • 在 protocol 中使用 property 只会生成 setter 和 getter 方法声明,使用属性的目的是希望遵守些协议的对象能够实现该属性。