iOS

ios 关于深拷贝和浅拷贝的深入理解

2017-06-15  本文已影响0人  iOS开发小平哥

OC 语言的拷贝分三种:浅拷贝,不完全深拷贝,完全深拷贝,来让我们举个🌰:

1.浅拷贝:没有开辟新的指针地址,只是将新对象指向原来的指针。

2.不完全深拷贝:开辟了新的指针地址,但是如果拷贝的对象是容器类(NSArray等),容器内的元素还是原来的的元素,即容器内元素指针地址指向同一块内存。不完全深拷贝拷贝的只是一个容器对象(也就是一个壳),容器内的对象只保存一份引用。

3.完全深拷贝:开辟了新的指针地址,而且如果拷贝的对象是容器类(NSArray等),容器内的元素同样也深拷贝了,开辟了新的内存空间,即容器内元素指针地址也改变了。完全深拷贝是连同容器和内容对象一起拷贝一份,完完全全的拷贝。

拷贝的目的是产生两个互不影响的对象,所以:

1、对不可变对象来说,由于对象本身不可以进行修改,即不能对它产生影响。所以不可变对象的 copy 都是浅拷贝。

2、不可变对象的 mutableCopy 是深拷贝。(这里说的深拷贝是不完全深拷贝)

3、可变对象的 copy 是深拷贝。

4、可变对象的 mutableCopy 是深拷贝。

参考以下列表说明

以下是完全深拷贝的理解:

完全深拷贝是连同容器和内容对象一起拷贝一份,完完全全的拷贝.

我们不论是修改copyArry还是修改copyArry里面的objc都不会影响到arry和arry里面的objc.

默认情况下的深拷贝都是不完全深拷贝,如果需要实现完全深拷贝,使用下面的方法:

对于容器对象,也完全遵守上面的情况,只不过发生深拷贝时对容器对象本身来说是深拷贝,因为产生了新对象,而对容器内的元素来说是浅拷贝。即:修改容器内的元素,无论是原来对象还是拷贝产生的新对象,两个容器内的元素都会发生变化,因为容器内存的是容器元素的内存地址。如果想让容器对象本身及容器内的元素都发生完全深拷贝,使用[[NSArray alloc] initWithArray:mArr1copyItems:YES];才能真正的实现完全深拷贝。后面的item一定要设置为YES才是完全深拷贝

最后,如果本文章对你有帮助,希望点赞,评论666

本人github开源库地址:https://github.com/lishiping ,希望对广大iOS开发者有帮助

Cocoapod公开库:

1.SafeData---使用array,dictionary类别,主要是保护数组防止插入空数组,防止数组越界,在开发中非常实用,字典的类别也非常实用,可以直接得到转换后的类型 SafeData

2.SPDebugBar ---A tool to help developers and testers quickly switch the server address, convenient to debug the program.一个小工具帮助开发人员和测试人员快速切换服务器地址,方便调试程序,可以在debug模式下或者测试包上方便切换地址SPDebugBar

3.SPFastPush---Use Macro Fast NavigationController push next VC,and Fast Pop anther VC.使用宏帮助导航控制器快速push下一个Viewcontroller,并使用KVC快速给下一个VC赋值,也可以使用宏定义快速返回上一层VC或者指定的VC SPFastPush

4.SPMacro---一些foundation层的一些宏定义,打印宏定义,类型判断,通知使用,线程使用等,和一些UIKit层的宏定义,屏幕方面的宏定义,颜色方面的宏定义,图片宏定义SPMacro

5.SPWebView---SPWebView是一个基于OC代码实现的WebView轻量级组件,将UIWebView和WKWebView的API封装成统一的类去使用,并且在加载网页的时候提供进度条,同时简化JS与OC互相调用及传递数据的方式。仿微信界面 SPWebView

6.SPCategory---SPWebView是一个常用类别库,size,字符串,hud等 SPCategory

上一篇下一篇

猜你喜欢

热点阅读