iOS 深拷贝及浅拷贝的区别

2017-04-25  本文已影响0人  ninazhang

一、浅拷贝及深拷贝

1、浅拷贝(指针copy)

1)相当于对指向对象的指针进行复制,产生一个新的指向对象的指针;

2)就有两个指针指向同一个对象;

3)这个对象销毁后,两个指针都应置空;

4)对象引用计数+1

2、深拷贝(内容copy)

深copy不仅会复制对象本身,而且会递归复制每个指针类型的实例变量,直到两个对象没有任何公共的部分。

1)相当于对对象进行复制,产生一个新的对象;

2)就有两个指针分别指向两个对象;

3)当其中一个对象改变或者销毁后,另一个对象不受影响;

4)源对象引用计数不变,副本计数器设置为1

二、copy及mutableCopy

    NSObject类提供了copy和mutableCopy方法,通过这两个方法即可复制已有对象的副本

     NSString,NSMUtablestring等系统类默认遵守NSCoppying及NSMUtableCoppying协议。

     只有不可变对象创建的不可变副本(copy)才是浅copy,其它都是深copy。

1、copy方法

1)只要调用copy方法,总是返回对象的不可修改的副本。即便该对象本身是可修改的

2)eg: 调用NSMUtableString的copy方法,将返回不可修改的字符串对象。

2、mutableCopy方法

1)只要调用mutableCopy方法,总是返回对象的可变副本。即便该对象本身是不可修改的。

2)eg: 调用NSString的mutableCopy方法,总是返回对象的可修改的字符串对象。

3、示例代码

4、系统对象总结

1、对于系统的非容器类对象(eg:NSString,NSMUtableString)

如果对[不可变]对象复制,copy是指针复制(浅拷贝), mutableCopy就是对象复制(深拷贝)。

如果是对可变对象复制,都是深拷贝,但是copy返回的对象是不可变的。

2、对于系统的容器类对象(eg:NSArray ,NSDictionary)

对于容器类本身,上面讨论的结论也是适用的,只不过是容器对象中的元素是是浅copy。

5、自定义类调用copy与mutableCopy复制对象的副本

声明协议 重写方法 调用

6、setter方法的copy选项

1)copy指示符就是指定当前程序调用setter方法复制时,实际上是将传入参数的副本赋值给程序的实例变量。(通过点语法赋值时,实际上调用的就是setter方法)

上一篇 下一篇

猜你喜欢

热点阅读