一.copy的理解
copy就是复制,简单的说就是创建一个一摸一样的东西。但是再oc当中,复制是否和语言的理解一样呢?当然不是一样的。说的明白点,外观师一样的,但是地址却是不同的。
其实copy是包括浅复制(copy)和深复制(mutableCopy)。那么我们来说说深复制吧。通过xcode我们来看看copy吧。首先按住command并且用鼠标点击copy进入一到Foundation里面,你可以看到内部的方法是这样的。
深复制,其实就是一个对象方法然后如果你想进一步了解深复制的话,是不可能的,因为苹果公司是不开源的,所以,你无法了解到底深复制内部的方法是如何的实现的,当然实现的地方就在@implementation里面。但是我们只需要知道它的作用就行。
那么,到底深复制在Foundation下面起什么作用呢?我们来看一个深复制的代码吧。
然后我们来看看打印出来的结果吧:
由结果我们不难得出创建的对象和深复制后的对象地址明显的不相等。那么,这就有问题了,到底深复制是复制什么呢?我们可以用图来解释这个到底是什么复制。
由图我们不难看出来,深复制是复制指针和复制对象,但是复制过后他们的地址是不一样的,但是内容一样。意思就是说将整个对象复制一份,返回新对象的地址所以上面才会得出来str和str2的地址是不一样的。深复制的单词是mutablecopy,不用去刻意的记住,只要知道怎么用的就行,到时候需要用到的时候直接找资料就好。
浅复制。那么又何为浅复制呢?浅复制就是copy地址,相当于复制指针。那我们来看具体的代码吧。
我们再来看看打印的结果吧:
由上面我们不难看出,两个对象打印出来的结果都是一样的。那么我们可以得出结论了:浅复制,其实就是地址的复制,也就是复制指针。
那么下面就是我为大家画的图,方便大家理解。
复制的指针,也就是说指针里面的内容是不会变的,同样的指向同一个对象,但是自己的地址是不一样的。然后我用一句话总结出了这两者的区别:对不可变执行不可变copy是"浅复制",其余都是"深复制","浅复制"没有产生新对象,"深复制"产生了新对象.
二.copy和retain的区别
首先两者必须是在@property中才会存在区别,为甚么呢?因为copy(浅复制)也会引起计数器+1的操作。也就是说:
1)copy一个不可变对象,只是对不可变对象的引用计数器+1,并且获得地址,并未产生新的对象。
2)@property中的retain实际是获得对象的地址.没有产生新的副本,只是让对象的引用计数器+1而copy是拷贝了新的副本对象,新副本的引用计数器为1.
所以呢,这是两者的最大的区别。那么就写到这了,有什么issue可以联系我,我们一起讨论。非常感谢!!!!