copy深拷贝和浅拷贝的区别

阅读本文之前首先了解copy与retain的区别,如果有不正确的地方望大家多多指教:

copy是创建一个新对象,retain是创建一个指针,引用对象计数加1。Copy属性表示两个对象内容相同,新的对象retain为1 ,与旧有对象的引用计数无关,旧有对象没有变化。copy减少对象对上下文的依赖。

retain属性表示两个对象地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值+1也就是说,retain 是指针拷贝,copy 是内容拷贝。

当然在ios中并不是所有的对象都支持copy,mutableCopy,遵守NSCopying 协议的类可以发送copy消息,遵守NSMutableCopying 协议的类才可以发送mutableCopy消息。假如发送了一个没有遵守上诉两协议而发送 copy或者 mutableCopy,那么就会发生异常。但是默认的ios类并没有遵守这两个协议。如果想自定义一下copy 那么就必须遵守NSCopying,并且实现 copyWithZone: 方法,如果想自定义一下mutableCopy 那么就必须遵守NSMutableCopying,并且实现 mutableCopyWithZone: 方法。

废话不多说,看代码:(注意咯:在MRC的环境下编译的哟~)

第一步我们首先创建一个Person的类,Person.h

Person.h

第一种情况:

不可变copy拷贝不可变对象(浅拷贝)

我们来看看输出结果:


打印输出的结果

第二种情况:

不可变copy拷贝可变对象(深拷贝)
打印输出结果

第三种情况:

可变copy拷贝不可变对象(深拷贝)


打印输出结果

第四种情况:

可变copy拷贝可变对象(深拷贝)
打印输出结果

第五种情况:

自定义类的copy
打印输出结果

第六种情况:

属性的copy
打印输出结果

阅读完以上的几种情况,我相信大家对copy的理解加深了一层,最后我总结出:

copy

1.不可变copy拷贝不可变对象(浅拷贝)

2.不可变copy拷贝可变对象 (深拷贝)

不可变copy拷贝拷贝出来的对象是不可变的

3.可变copy拷贝不可变对象(深拷贝)

4.可变copy拷贝可变对象 (深拷贝)

可变copy拷贝拷贝出来的对象是可变的

PS:本文章是我的个人学习心得,如有错误请告之~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容