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 地址不相同)
所以是深拷贝
简单的说 判断是深拷贝还是浅拷贝的方式 就是看它有没有生成新的对象 .
如果生成了新的对象那么就是深拷贝 , 反之亦然 .