您的位置:首页 > 移动开发 > Objective-C

IOS开发之路-Objective-C copy(浅拷贝与深拷贝)

2013-08-08 18:08 399 查看
oc中拷贝分两种,深拷贝和浅拷贝

我个人认为深拷贝就像是windows中文件的复制(拷贝) , 而浅拷贝就像是windows中创建的文件快捷方式.

两者的区别在于 , 复制是创建了一个新的文件拷贝了原来的东西 ,所以就有两个对象 . 因为两个对象所在路径是不一样的.

而快捷方式呢 ,则是引用了原来文件的路径 , 但并不会创建新文件.

深拷贝 和 浅拷贝 原理也一样 .

深拷贝:内容拷贝
,源对象和副本指向的是不同的两个对象。源对象引用计数器不变,副本计数器设置为1;

浅拷贝: 指针拷贝

源对象的和副本指向的是同一对象

对象的引用计数+1,其实相当于做了一次retain操作。

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

比如:

NSString *string =
@"hello Objective-c";
NSString *str = [string
copy];
NSLog(@"%i",str == string);
NSLog(@"副本计数器:%zi",[str
retainCount]);

上例中string 是不可变字符串 , copy后也会变一个不可变的字符串 。 所以str 指向的是string 的地址 。 所以 i 的值为1 (两对象地址相同).

所以上例是浅拷贝

NSString *string = [NSString
stringWithFormat:@"hello objective-c"];
NSString *str = [string
mutableCopy];
NSLog(@"%i",string == str);
NSLog(@"副本计数器:%zi",[str
retainCount]);

上例中虽然string是不可变字符串 , 但是mutableCopy之后会返回一个可变字符串 。 接收的确实不可变字符串所以 i 为0 (str 和string 地址不相同)
所以是深拷贝

简单的说 判断是深拷贝还是浅拷贝的方式 就是看它有没有生成新的对象 .
如果生成了新的对象那么就是深拷贝 , 反之亦然 .
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: