1、copy
copy属性的目的就是为了改变副本而不去影响源对象
- 深拷贝就是把内容拷贝一份产生一份新的对象,新对象计数器为1,源对象计数器不变
- 浅拷贝是指针拷贝,把地址给你,你和我指向同一个对象,源对象计数器加一,源对象和副本的计数器相同。
可变对象进行copy就是深拷贝因为可变对象变成了不可变对象了,结构上发生了改变。
拷贝函数有copy和mutablecopy,调用copy时,不管是NSString、NSDictionary、NSArray、NSMutableString、NSMutableDictionary,或是NSMutableArray,都是copy出来是不可变的副本。
当调用mutablecopy产生的都是可变的副本。可变对象和不可变对象进行mutablecopy都是产生了一个新的对象,计数器为1,原来的对象计数器不变。而如果是copy而且是不可变对象进行copy的话则是浅拷贝没有产生一个新的对象相当于retain操作了,因为OC设置copy语法本身就是为了改变副本而不去影响源对象,所以为了性能着想既然copy出来的都不可变了,自然也就不会产生一个新的对象了。
总结:只有不可变对象调用copy为浅拷贝其他都是深拷贝
2、assign
一般用来修饰基础数据类型(NSIntrger,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方法加锁。
来源于:作者:Lskyu,链接:https://www.jianshu.com/p/c92403db1861
记录备忘所用