美文网首页
iOS 拷贝和深拷贝的总结

iOS 拷贝和深拷贝的总结

作者: 顶级蜗牛 | 来源:发表于2018-10-11 17:38 被阅读109次

copy和mutableCopy的概念:

copy 浅拷贝,不拷贝对象本身,仅仅是拷贝指向对象的指针。

浅拷贝指针指向图

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

深拷贝指针指向图

一、字符串

1.NSString的Copy与MutableCopy:

NSString的Copy与MutableCopy

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

NSString拷贝结果重新赋值

当nsstr2重新赋值时,指针指向的内存发生了改变,故不会改变原来nasstr1的值。所以浅拷贝的时候,为了优化性能,系统没必要另外提供内存,只生成另外一个指针,指向同一块内存空间就行。

但是当你从新给 str1 或者str2赋值的时候,因为之前的内容不可变,还有互不影响的原则下,这个时候,系统会从新开辟一块内存空间。

2.NSMutableString的Copy与MutableCopy

NSMutableString的Copy与MutableCopy

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

NSMutableString拷贝结果重新赋值

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

3.String的Copy与MutableCopy

String的Copy与MutableCopy

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

我们来看看重新赋值后的产生结果:

String拷贝结果重新赋值

发现不管是哪个拷贝都会产生了新的内存空间,是因为当前指针变相指向一块新的内存存储新的字符串。

二、数组

1.NSArray的Copy与MutableCopy:

NSArray的Copy与MutableCopy

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

2.NSMutableArray的Copy与MutableCopy:

NSMutableArray的Copy与MutableCopy

对于可变数组,可以看到不管哪种copy,都会开辟一个新的内存空间,而且新内存空间的数组的元素值都指向原数组的元素值。注意一点:NSMutableArray进行copy出来后的数组可以是NSMutableArray类型,但是它是不可以addObject的,因为实际上是NSArray类型。

那么String与Array有什么区别呢,一个是集合类,一个是非集合类,再对其他遵循NSCopying与NSMutableCopying协议的类进行操作,大概得出以下结论:

相关文章

网友评论

      本文标题:iOS 拷贝和深拷贝的总结

      本文链接:https://www.haomeiwen.com/subject/lctpaftx.html