iOS中属性修饰符
ios中的主要属性修饰符包含:
- copy
- assign
- retain
- strong
- weak
- readwrite
- readonly
- nonatomic
- atomic
其中在MRC模式中使用的是assign和retain,在ARC中使用的是assign、strong和weak
属性修饰符详述
1、copy
copy属性的目的就是为了改变副本而不去影响源对象
要理解copy属性,首先需要理解深拷贝与浅拷贝:
- 深拷贝就是把内容拷贝一份产生一份新的对象,新对象计数器为1,源对象计数器不变
- 浅拷贝是指针拷贝,把地址给你,你和我指向同一个对象,源对象计数器加一,源对象和副本的计数器相同。
拷贝函数有copy和mutablecopy,调用copy时,不管是NSString、NSDictionary、NSArray、NSMutableString、NSMutableDictionary,或是NSMutableArray,都是copy出来是不可变的副本。
当调用mutablecopy产生的都是可变的副本。可变对象和不可变对象进行mutablecopy都是产生了一个新的对象,计数器为1,原来的对象计数器不变。而如果是copy而且是不可变对象进行copy的话则是浅拷贝没有产生一个新的对象相当于retain操作了,因为OC设置copy语法本身就是为了改变副本而不去影响源对象,所以为了性能着想既然copy出来的都不可变了,自然也就不会产生一个新的对象了。
可变对象进行copy就是深拷贝因为可变对象变成了不可变对象了,结构上发生了改变。总结来说就是只有不可变对象调用copy为浅拷贝其他都是深拷贝。
以上关于深拷贝和浅拷贝内容参考MooAiFighting。
2、assign
一般用来修饰基础数据类型(NSInteger, CGFloat) 和 C数据类型(int ,float, double)等。它的setter方法直接赋值,不进行任何retain操作。
3、 retain
一般在MRC模式下使用,被retain修饰的对象,引用计数retainCount要加1的。retain只能修饰oc对象,不能修饰非oc对象。
需注意:容易出现循环引用,导致内存泄露问题。
4、 strong
strong表示对对象的强引用,一般在ARC模式下使用,相当于retain
注意:两个对象之间相互强引用造成循环引用,内存泄漏。
5、 weak
weak表示对对象的弱引用,一般在ARC模式下使用,被weak修饰的对象随时可被系统销毁和回收,用weak修饰弱引用,不会使传入对象的引用计数加1,weak比较常用的地方就是delegate属性的设置。
assign和weak的区别:当它们指向的对象释放以后,weak会被自动设置为nil,而assign不会,所以会导致野指针的出现,可能会导致crash。
strong和weak的区别:strong 表明是一个强引用,相当于MRC下的retain,只要被strong引用的对象就不会被销毁,当所有的强引用消除时,对象的引用计数为0时,对象才会被销毁。
weak 表明是一个弱引用,相当于MRC下的assign,不会使对象的引用计数+1。
6、 readwrite和readonly
当我们用readwrite修饰的时候表示该属性可读可改,用readonly修饰的时候表示这个属性只可以读取,不可以修改,一般常用在我们不希望外界改变只希望外界读取这种情况。系统默认的情况就是 readwrite。
7、 nonatomic和atomic
nonatomic 非原子属性。它的特点是多线程并发访问性能高,但是访问不安全;与之相对的就是atomic,特点就是安全但是是以耗费系统资源为代价,所以一般在工程开发中用nonatomic的时候比较多。系统默认的是atomic,为setter方法加锁,而nonatomic 不为setter方法加锁。
参考资料
https://www.jianshu.com/p/3cbc79424fb8