首页 > 代码库 > 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是一个更好的选择。