首页 > 代码库 > IOS开发之copy的问题
IOS开发之copy的问题
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是一个更好的选择。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。