iOS深浅拷贝

引言

在对于自定义的对象支持copy功能,也就是我们要给自定义的对象发送copy message,那我们就要手动实现NSCopying协议。在项目开发中我们如果对某个字典或者数组对象进行了一次mutbleCopy其实系统默认的调用了如下API:

- (id)mutableCopyWithZone:(nullable NSZone *)zone;

浅拷贝

如果你现在通过retain或者alloc创建并持有了一个对象,浅拷贝就是重新拷贝了一个指向当前这个对象的指针,此时就有两份指针同时指向当前对象的内存区域,即指向同一块内存区域,对象只有一份并没有发生任何变化。

NSString *hdfString = @"haodf.com";
NSString *str = hdfString;
NSString *str2 = [str copy];

深拷贝

深拷贝拷贝当前指针指向的对象,系统会随机给拷贝的对象重新分配一块内存,�深拷贝以后,两份对象的内存地址不一样,指针指向也不一样。深拷贝会把当前容器中的对象重新拷贝一份放到另一个容器中,拷贝后的指针指向新的容器。

NSString *hdfString = @"haodf.com";
NSString *str = [hdfString copy];
NSString *str2 = [str mutableCopy];

小结

1、对不可变的对象进行mutableCopy操作,是进行了一次深拷贝,返回的对象是可变的对象。

2、对不可变的对象进行copy操作,进行了一次浅拷贝,返回一个不可变的对象。

3、对可变得对象进行copy,进行了深拷贝,产生了不可变的对象副本。

4、 对可变的对象进行了一次mutableCopy,是进行了一次深拷贝, 返回的对象是一个可变的对象。

5、想要让自定义的对象支持copy和mutableCopy那么就要对应实现NSCopying协议,和NSMutableCopying协议。

retain和copy的区别:

 1、retain是对当前对象增加了一个指针指向,使对象的引用计数器加1, 是进行了一次安全的浅拷贝操作。
 2、copy是对当前对象进行了一次拷贝,重新拷贝了当前对象,当使用的时候减少了对当前对象的依赖。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 道歉 之前我的一篇关于深浅拷贝的文章,里面有诸多错误,主要是混淆了混淆copy、mutableCopy和深浅拷贝,...
    西木柚子阅读 8,435评论 20 46
  • 这些天开发遇到些数据拷贝的问题,然后在深浅拷贝上�有些迷糊,网上找了些资料,看了半天也不是很明白,最后决定写代码测...
    飞到哪阅读 2,870评论 0 2
  • (本文根据CocoaChina上的一篇帖子整理,后期附上链接)最开始,我们需要清楚一些关于内存分配方式的基础知识。...
    CaptainJK阅读 1,652评论 0 0
  • 一、引言 我们都知道,iOS中的对象,遵守NSCopying 协议的类可以发送copy消息,遵守NSMutable...
    Cheriez阅读 2,463评论 0 3
  • 1、对象拷贝有两种方式:浅复制和深复制。顾名思义,浅复制,并不拷贝对象本身,仅仅是拷贝指向对象的指针;深复制是直接...
    滴答大阅读 4,147评论 0 2

友情链接更多精彩内容