copy和retain的使用区别
从上图的截图代码当中,左边的使用的时retain方法,右边使用的是copy方法。
左边的打印结果为:
右边的打印结果为:
两者之间区别是在于:
(1)retain是在同一块内存地址操作,而copy是重新复制了新的一快内存地址;
(2)retain: 当要使用某个对象的时候,必须使用retain保留该对象;谁retain、谁release,谁污染,谁治理。
深拷贝和浅拷贝复制的区别:
(1)浅拷贝只复制对象的本身,对象里的属性、包含的对象不做复制。
(2)深复制则即复制对象本身,对象的属性也会复制一份。
(3)Foundation框架中支持复制的类,默认是浅复制。
如图下图深拷贝和浅拷贝的区别:
列如:
对象的自定义拷贝
例如:浅拷贝对象截图
打印结果为:
总结:由打印的结果看出:person1复制出了一个新的对象person2,使用了NSCopying 协议。而age1的地址却没有发生改变,说明为浅拷贝对象。
深拷贝对象截图:
打印结果为:
总结:name的地址发生了改变,说明为深拷贝,判断copy协议是否为深拷贝或者浅拷贝时,要先判断是否复制了对象的属性。
copy、mutableCopy和retain之间的关系
(1)Foundation可复制的对象,当我们copy的是一个不可变的对象时,它的作用相当于retain(Cocoa做的内存优化)《copy+不可变相当于retain》。
(2)当我们使用mutableCopy时,无论源对象是否可变,副本是可变的,并且实现了真正意义上的拷贝。
(3)当我们copy的时一个可变对象时,副本对象时不可变的,同样实现了真正意义上的拷贝。