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