不可变类型使用copy:
image.png可以看出,name与namecopy指向的地址一致,是浅拷贝,再说一下,有些小伙伴看到这里,既然namecopy与name指向的内存地址一致,那么我改变namecopy的值时,name的值不是会改变?
image.png
从以上结果看出,name的值并没有被改变,因为namecopy实际上是一个指针,当赋值了另外一个对象时,只是改变了它的指向,不是指向原来name指向的地址,从打印结果可以看出指向发生了改变.
可变类型使用copy:
image.png可以看出,可变类型使用copy时,namecopy指向了另一个地址,是深拷贝
不可变类型使用MutableCopy:
image.png可以看出,不可变类型使用MutableCopy时,namecopy指向了另一个地址,是深拷贝
可变类型使用MutableCopy:
image.png可以看出,可变类型使用MutableCopy时,namecopy指向了另一个地址,是深拷贝
总结:
不可变类型 | 可变类型 | |
---|---|---|
copy | 浅拷贝 | 深拷贝 |
mutableCopy | 深拷贝 | 深拷贝 |
实例:
当由A界面跳转到B界面的时候,B界面需要使用A界面的数据,如果是浅拷贝,那么当在B界面数据被改变后,A界面的数据也是同时会被改变的,所以当由A界面跳转B界面的时候,我们要使用深拷贝,保证数据不受影响,如果跳转回来需要用到改变后的数据的话可以使用闭包带回来,减少页面之间的耦合性.
tips:
自己实现的类调用copy或者mutableCopy时要看我们自己实现的copy/mutableCopy方法,以上讨论的是系统自己实现了这两个方法的.
网友评论