标签:com blog class div code log c string t sp tab
copy的目的就是修改副本,修改原始对象和副本时不会产生干扰。
定义一个不可变属性A,再定义一个可变属性B。用B做添加删除等操作后再将B赋值给A时,有些人习惯用A = B;其实这样是不安全的。
假设有下面的一段代码:
1
2
3
4
5
6
7
8
9
10 |
int
main() { NSMutableString
*strM = [ NSMutableString
stringWithString@ "123" ]; NSString
*str = strM; NSLog (@ "%@" ,str); id
str2 = str; [str2 setString@ "hello" ]; NSLog (@ "%@" ,str); return
0; } |
输出的结果前面是123,而后面是hello了。也就是是定义的不可变str别人是可以改变的了。这样就不安全。
而将NSString *str = [strM copy];编译时候就会直接报错,从而达到了定义的不可变对象str不允许别人修改的目的。
这里有一个深复制和浅复制的概念:
深复制:内容拷贝,创建出来的对象和源对象是两个不同的对象,源对象引用计数器不变,新对象计数器设为1
浅复制:创建出来的对象和源对象是相同的对象,引用计数器加1,相当做了一个retain操作。
而只有不可变对象创建不可变副本(copy)时,才是浅复制,其他情况(如用mutableCopy或者可变对象用copy)都是深复制
深复制创建的新对象拥有自己的地址。当我们把它定义为不可变时,别人用复制表达式再去修改就会报错了。
所以在将一个可变的对象赋值给不可变时,用copy是一个更好的选择。
标签:com blog class div code log c string t sp tab
原文地址:http://www.cnblogs.com/ioslps/p/3695860.html