iOS深浅拷贝

作者: 骁驰 | 来源:发表于2016-04-20 11:03 被阅读814次

引言

在对于自定义的对象支持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是对当前对象进行了一次拷贝,重新拷贝了当前对象,当使用的时候减少了对当前对象的依赖。

相关文章

  • iOS 深浅拷贝

    iOS深浅拷贝

  • iOS深浅拷贝

    授权转载,作者:西木柚子 OC对象的三种拷贝方式 OC的对象拷贝有如下三种方式,很多时候我们把深复制和完全复制混为...

  • iOS深浅拷贝

    简述深浅拷贝 我们实例化的对象存储在堆区,而指向对象的指针一般存储在栈区。我们需要知道这个前提。  实际上拷贝分为...

  • iOS深浅拷贝

    浅拷贝:复制一个指针,仍然指向已经存在的内存深拷贝:复制一个指针,并新申请一个内存 关于拷贝的引用计数:浅拷贝:a...

  • iOS 深浅拷贝

    一、引言 我们都知道,iOS中的对象,遵守NSCopying 协议的类可以发送copy消息,遵守NSMutable...

  • iOS 深浅拷贝

    http://www.cocoachina.com/cms/wap.php?action=article&id=2...

  • iOS深浅拷贝

    (本文根据CocoaChina上的一篇帖子整理,后期附上链接)最开始,我们需要清楚一些关于内存分配方式的基础知识。...

  • iOS深浅拷贝

    引言 在对于自定义的对象支持copy功能,也就是我们要给自定义的对象发送copy message,那我们就要手动实...

  • iOS 深浅拷贝

    深拷贝和浅拷贝的本质区别是地址是否相同。 浅拷贝并没有进行真正的复制,而是复制的对象和原对象都指向同一个地址; 深...

  • iOS 深浅拷贝

    iOS深拷贝与浅拷贝的区别 深拷贝与浅拷贝的概念:(我的理解,望不吝赐教) 浅拷贝:只copy一份对象的指针,指向...

网友评论

    本文标题:iOS深浅拷贝

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