copy和mutableCopy的概念:
copy 浅拷贝,不拷贝对象本身,仅仅是拷贝指向对象的指针。


mutableCopy 深拷贝,是直接拷贝整个对象内存到另一块内存中。


一、字符串
1.NSString的Copy与MutableCopy:

不难看出nsstr1.copy()是浅拷贝,拷贝一个指针指向同一块内存空间,nsstr1.mutableCopy()是深拷贝,拷贝一块新的内存空间。但这里需要注意的是:

当nsstr2重新赋值时,指针指向的内存发生了改变,故不会改变原来nasstr1的值。所以浅拷贝的时候,为了优化性能,系统没必要另外提供内存,只生成另外一个指针,指向同一块内存空间就行。
但是当你从新给 str1 或者str2赋值的时候,因为之前的内容不可变,还有互不影响的原则下,这个时候,系统会从新开辟一块内存空间。
2.NSMutableString的Copy与MutableCopy

NSMutableString无论哪种拷贝都是开辟内存空间。让我们看看它的拷贝之后的重新赋值情况:

修改原始数据的时候对于mutableString 不论copy ,mutable copy,都不会有影响, 说明mutableString不论哪种拷贝都会开辟一个新的内存空间,并重新赋值,也就是整个对象都拷贝一份。
3.String的Copy与MutableCopy

发现Swift的String无论是哪个拷贝地址都是没有变的,为什么呢?因为String不同于NSString,String是结构体类型,即是值引用,所以无论哪种拷贝都是拷贝出一个指针指向同一块内存即浅拷贝。
我们来看看重新赋值后的产生结果:

发现不管是哪个拷贝都会产生了新的内存空间,是因为当前指针变相指向一块新的内存存储新的字符串。
二、数组
1.NSArray的Copy与MutableCopy:

数组copy与NSString一样,都是指针拷贝,但是mutableCopy有些不一样了,虽然开辟了新的内存空间,但是值并没有重新拷贝一份,数组元素的值还是指向原数组元素值。就相当于是数组本身是深拷贝,数组里面的每个元素都做了浅拷贝。
2.NSMutableArray的Copy与MutableCopy:

对于可变数组,可以看到不管哪种copy,都会开辟一个新的内存空间,而且新内存空间的数组的元素值都指向原数组的元素值。注意一点:NSMutableArray进行copy出来后的数组可以是NSMutableArray类型,但是它是不可以addObject的,因为实际上是NSArray类型。
那么String与Array有什么区别呢,一个是集合类,一个是非集合类,再对其他遵循NSCopying与NSMutableCopying协议的类进行操作,大概得出以下结论:

网友评论