深拷贝 : 拷贝出来的对象与源对象地址不一致! 这意味着我修改拷贝对象的值对源对象的值没有任何影响.
浅拷贝 : 拷贝出来的对象与源对象地址一致! 这意味着我修改拷贝对象的值会直接影响到源对象.
这里需要纠正网上一些错误的观点(以下为错误观点)
copy都是浅拷贝, mutableCopy都是深拷贝
我们知道, 当我们用copy从一个可变对象拷贝出一个不可变对象时, 这种情况就属于深拷贝而不是浅拷贝!!####
注意 ! 深拷贝与浅拷贝也有相对之分!!!看下面
对于NSString对象, 确实深拷贝就是深拷贝, 浅拷贝就是浅拷贝, 没有任何异议.
但是对于NSArray, NSDictionary, NSSet这些容器类的对象呢? 当然浅拷贝依然是指针拷贝, 那深拷贝意味着连同容器及其容器内的对象一并拷贝吗? 还是只拷贝容器对象, 对容器内的对象则只是简单引用呢? 这里有两种情况, 我姑且把它称为不完全深拷贝与完全深拷贝。
copy相对于直接赋值的好处
看看以下代码 :
![](https://img.haomeiwen.com/i1862021/241ed6eae6479846.png)
大家猜猜控制台输出是啥? 是( Kobe ), ( Kobe, McGrady )吗?
错了错了!!!
array = (
Kobe,
McGragy
), mArray = (
Kobe,
McGragy
)
为什么??? 明明可变数组添加对象是在赋值之后, 为什么后面添加对象还会影响到不可变数组呢??
原因很简单, 因为Objective-C支持多态.
所以表面上self.array是NSArray对象, 其实骨子里是NSMutableArray对象.这样的话将会对后期DEBUG增加很大的成本, 可能会导致莫名其妙的错误.
再看以下代码 :
![](https://img.haomeiwen.com/i1862021/ec960a49e655a4cb.png)
大家再来猜一下输出会是什么?
没错!
array = (
Kobe
), mArray = (
Kobe,
McGragy
)
总结
这里做出了一张图, 帮助新手弄清楚copy与mutableCopy的区别, 大神请无视_
![](https://img.haomeiwen.com/i1862021/d9694468cbad6cdc.png)
网友评论