美文网首页
iOS 深复制浅复制

iOS 深复制浅复制

作者: original_QIU | 来源:发表于2019-01-29 11:24 被阅读9次

深浅拷贝相信对于大多数iOS开发者而言并不陌生,写这篇文章的目的是在公司项目的开发中遇到的一个可变数组赋值问题所以专门总结下深浅拷贝的知识。

提要

本篇文章主要围绕以下几点来讲述:

1、深浅拷贝的概念

2、集合与非集合对象的深浅拷贝差异

3、一些Tips

拷贝前提

一个对象是否可以拷贝取决于该对象是否遵循NSCopying协议,并且实现copyWithZone:方法。如果一个类有可变和不可变类型,那么不可变类需要遵守NSMutableCopying协议,并且实现mutableCopyWithZone 方法确保被复制对象保持可变。

深浅拷贝的概念

浅拷贝:指针拷贝,仅拷贝对象指针,对象内存地址并不发生改变。

图一@2x.png

深拷贝:内容拷贝,完全复制一份对象,复制对象与旧对象内存地址不同。

图二@2x.png

集合与非集合对象的深浅拷贝

对于iOS中的对象来说,我们可以将其大致的分为集合对象(NSArray、NSSet等)和非集合对象(NSString、NSNumber等)。对于拷贝而言有如下几种情况。

1、不可变对象的拷贝操作

2、不可变对象的可变拷贝操作

3、可变对象的拷贝操作

4、可变对象的可变拷贝操作

非集合对象的深浅拷贝

1、不可变对象的拷贝操作

图3@2x.png

打印结果


图4@2x.png

结论:不可变对象copy为浅复制,mutableCopy为深复制。

2、可变对象的拷贝操作

图五@2x.png

打印结果

图六@2x.png

结论:不可变对象copy与mutableCopy都是深复制

集合对象的深浅拷贝

集合对象深浅拷贝图解

图七@2x.png

1、集合对象的浅复制

对于集合来说有许多种方法来实现浅复制。当进行浅复制的时候,会向原始对象发送一个retain消息,同时指针会指向新的集合。

图八@2x.png

2、集合对象的深复制

方式一

图九@2x.png

需要将第二个参数设置为yes。

方式二

图十@2x.png

复制与可变性

当复制一个集合对象的时候,集合对象本身和集合所包含元素的可变性会受到影响。

copyWithZone: 仅使表层集合对象不可变,集合内部对象仍保持原有状态.

initWithArray:copyItems:第二个参数为NO时,表明该类创建时的表层可变性保持其初始值。更深层元素保持元其原有的可变性。

归档解档集合使得对象的可变与之前完全不同。

3、不可变集合对象的copy与mutableCopy

图十一@2x.png

结果:

图十二@2x.png

结论: 不可变集合对象copy为浅复制,mutableCopy为深复制

4、可变集合对象的copy与mutableCopy

图十三@2x.png

结果:

图十四@2x.png

结论:可变集合对象的copy与mutableCopy都是深复制。

一些tips

1、对于包含可变类型的类来说例如NSString,建议在写property时使用copy关键字,保护封装性。

2、对于从外部传入的数组,在函数内部对其进行拷贝操作,保证外部对数组的操作不会影响内部的。

3、等号直接赋值为浅复制。

希望以上总结对各位读者有所帮助。因个人能力所限,如果错误及纰漏还请广大读者批评指正。

参考文章

苹果官方文档

相关文章

  • iOS

    开发记录 iOS 深复制与浅复制 浅拷贝就是拷贝后,并没有进行真正的复制,而是复制的对象和原对象都指向同一个地址 ...

  • iOS 深、浅拷贝的理解

    iOS 的深、浅拷贝通过一张图片能够很直观理解: 对于系统的非容器类对象,对不可变对象复制,copy是指针复制(浅...

  • Javascript对象的深浅拷贝

    开门见山,有人叫对象的复制为深复制浅复制,也有人叫深拷贝浅拷贝。其实都是copy。 深拷贝(递归复制,复制所有层级...

  • 深浅复制

    参考链接 iOS 集合的深复制与浅复制

  • 浅|深 复制

    浅复制 //只写main函数 //结果是 我们可以看到一旦pointArray1发生了改变pointArray2也...

  • JS深浅拷贝

    浅拷贝 浅拷贝的意思就是只复制引用,而未复制真正的值。 深拷贝 深拷贝就是对目标的完全拷贝,不像浅拷贝那样只是复制...

  • 2018-01-06 关于javascript的深拷贝浅拷贝 思

    目录: 什么是复制? 一个简单的浅复制 一个深复制的例子 普遍的深浅复制的几种实现方法 深拷贝,浅拷贝什么是复制?...

  • iOS 集合的深复制与浅复制

    iOS 集合的深复制与浅复制 概念 对象拷贝有两种方式:浅复制和深复制。顾名思义,浅复制,并不拷贝对象本身,仅仅是...

  • 17.是否了解 深拷贝 和 浅拷贝 的概念,集合类深拷贝如何实现

    深拷贝内存拷贝 浅拷贝指针拷贝 浅拷贝 深拷贝 集合的浅复制 (shallow copy) 集合的浅复制有非常多种...

  • iOS全解11:特殊问题

    1、浅拷贝和深拷贝的区别? 浅拷贝:只复制指向对象的指针,指针指向同一个地址,而不复制引用对象本身。深拷贝:复制引...

网友评论

      本文标题:iOS 深复制浅复制

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