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的时一个可变对象时,副本对象时不可变的,同样实现了真正意义上的拷贝。

 

 
posted @ 2014-02-16 15:43  huangliangliang  阅读(387)  评论(0编辑  收藏  举报