美文网首页
【OC梳理】@property、@synthesize和@dyn

【OC梳理】@property、@synthesize和@dyn

作者: 忠橙_g | 来源:发表于2018-03-12 12:03 被阅读129次

@property

OC中,通过以下代码声明一个属性:

@property(描述1 , 描述2 , 描述3)(class *) varName 

其中三个描述词如下(可以不填,有默认值):

描述1:nonatomic<-->atomic (默认值atomic)

atomic保证了属性的原子性,其原理是在生成getter和setter方法时,使用互斥锁@synchronized(self)来保证对属性读/写的安全性(可以理解成会按调用的顺序串行执行),但其并 不能保证 线程的安全性,如果使用多线程同时修改其属性值,因为不能线程的执行顺序,所以执行的结果也不能确定。
nonatomic不保证属性的原子性,也就不会加上同步锁,所以效率上相比atomic要高,理论上如果没有特殊要求(不存在并发问题)的话, iOS 用 nonatomic 比较好。

描述2:readwrite<-->readonly (默认值readwrite)

readwrite可读写,外部可以正常调用getter和setter方法。
readonly只读,外部只能调用getter方法,不能调用setter方法。

描述3:strong/copy/weak/assign (默认值assign)

在自动生成setter函数的时候,编译器需要识别这个描述词来生成对应的setter函数。
strong: 对retain的ARC实现,对属性进行强引用。
copy: 生成setter函数时会使用copy方法(一般来说,对于不可变对象进行浅拷贝,可变对象进行深拷贝)
weak: 对属性进行弱引用,不会持有对象。当所有指向属性的strong类型指针都移除时,weak指针也会被移除。
assign: assign是指针赋值,不对引用计数操作,使用之后如果没有置为nil,可能就会产生野指针。通常用assign修饰基础数据类型。

如果自己实现了getter和setter方法,则三个描述词只起到提示作用,而没有实际作用

@synthesize

使用@synthesize 只有一个目的——给实例变量起个别名
iOS 6 之后 LLVM 编译器引入property autosynthesis,即属性自动合成。换句话说,就是编译器会为每个 @property 添加 @synthesize ,如以下形式:

@synthesize propertyName = _propertyName;
  • 当使用@synthesize 给属性添加别名后,将会覆盖自动合成的别名,只能使用新的别名。
  • 如果在protocol中声明了属性(其实只有getter和setter方法,并没有属性实例),那么在使用它之前,需要使用@synthesize来合成属性实例。

@dynamic

@dynamic告诉编译器,属性的setter与getter方法由用户自己实现,不自动生成。

  • 如果使用了@dynamic声明了属性,而没有实现setter/getter方法,虽然在编译时能够通过,但会在实际运行时由于缺少方法而崩溃(动态绑定)。
  • 主要使用在CoreData的实现NSManagedObject子类时使用,由Core Data框架在程序运行的时动态生成子类属性。

相关文章

网友评论

      本文标题:【OC梳理】@property、@synthesize和@dyn

      本文链接:https://www.haomeiwen.com/subject/bktnfftx.html