当前位置: 首页>编程语言>正文

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

copy深拷贝和浅拷贝的区别,第1张
Person.h

第一种情况:

copy深拷贝和浅拷贝的区别,第2张
不可变copy拷贝不可变对象(浅拷贝)

我们来看看输出结果:

copy深拷贝和浅拷贝的区别,第3张
打印输出的结果

第二种情况:

copy深拷贝和浅拷贝的区别,第4张
不可变copy拷贝可变对象(深拷贝)
copy深拷贝和浅拷贝的区别,第5张
打印输出结果

第三种情况:

copy深拷贝和浅拷贝的区别,第6张
可变copy拷贝不可变对象(深拷贝)
copy深拷贝和浅拷贝的区别,第7张
打印输出结果

第四种情况:

copy深拷贝和浅拷贝的区别,第8张
可变copy拷贝可变对象(深拷贝)
copy深拷贝和浅拷贝的区别,第9张
打印输出结果

第五种情况:

copy深拷贝和浅拷贝的区别,第10张
自定义类的copy
copy深拷贝和浅拷贝的区别,第11张
打印输出结果

第六种情况:

copy深拷贝和浅拷贝的区别,第12张
属性的copy
copy深拷贝和浅拷贝的区别,第13张
打印输出结果

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

copy

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

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

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

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

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

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

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


https://www.xamrdz.com/lan/5mg2016136.html

相关文章: