@property的几种属性
Updated:
strong&weak
strong和weak是ARC新引入的对象变量属性,strong相当于MRC的retain,而weak相当于assign。
ARC的一个基本规则即是,只要某个对象被任一strong指针指向,那么它将不会被销毁。如果对象没有被任何strong指针指向,那么就将被销毁。这就像放风筝,对象相当于风筝,strong引用就像一根线,一个风筝可以连多根线,只要还有一根线连着风筝就不会飘走;而weak引用就像用望远镜看风筝,你可以欣赏到它的美,但你不能阻止它飘走。
atomic&nonatomic
atomic(原子性):默认属性,编辑器合成的getter和setter方法会保证get、set操作的完整性,不受其它线程的影响。
1 | - (void)setName:(NSString *)name { |
然而atomic并不能保证线程安全,它只能保证getter不会访问到setter方法执行当中该属性的值,但不能保证在并行地执行多个setter和getter时getter会返回什么值。
一般情况下,iOS程序的所有属性都声明为nonatomic,是因为。在iOS中使用同步锁的开销比较大,这会带来性能问题,并且atomic并不能保证线程安全。想要实现线程安全,还需要采用更为深层的锁定机制。
关于@synchronized,这篇博文:iOS开发笔记–关于 @synchronized,这儿比你想知道的还要多 讲得非常详细
retain&assign
retain和assign是MRC时期的关键字
使用retain属性后自动生成的setter方法与下类似:
1 | -(void)setName:(test *)newname { |
这会使对象的引用计数器+1
而assing属性生成的setter方法会直接赋值而不进行retain操作。
copy
使用copy属性生成的setter方法如下:
1 | -(void)setName:(test *)newname { |
这与上面retain生成的setter方法很类似,只是在赋值时使用的是copy方法,让我们回到放风筝的例子里,使用copy属性就相当于你看到一个风筝很好看,你也想放那个风筝,那么你并不会从那个风筝上多连一根线到你手上,而是去买一个一模一样的风筝到旁边的一块地方放你自己的风筝,这就是copy。
值得注意的是,重写copy类型的setter方法时记得在赋值时用copy,否则外面的copy就是摆设。
readwrite&readonly
这两个属性的作用正如它们的名字所述:
- readwrite: 产生setter\getter方法
- readonly: 只产生getter,没有setter。
@synthesize
synthesize中文意思为‘合成’,添加对应属性的@synthsize语句后,在编译的过程中,编译器会帮你自动生成getter和setter方法,而现在的XCode在你声明属性后会自动帮你添加@synthesize语句:
1 | @synthesize propertyName |
这样你就可以通过_propertyName或者self.propertyName来访问属性了,不过,@synthesize还有这样的写法:
1 | @synthesize propertyName=asuijhdiuahwdiuawbndjbawjhbfc |
好的,现在你可以用asuijhdiuahwdiuawbndjbawjhbfc来访问属性了。
@dynamic
dynamic中文意思为‘动态’,添加@dynamic语句后,编译器不会自动生成getter和setter方法,需要自己实现。
有些存取是在运行时动态创建的,如在CoreData的NSManagedObject类使用的某些。如果你想在这些情况下,声明和使用属性,但要避免缺少方法在编译时的警告,你可以使用@dynamic动态指令,而不是@synthesize合成指令。