什么时候需要使用副本?

时间:2013-03-30 21:17:18

标签: ios objective-c copy

我尝试了解何时需要使用copy?我认为copy分配新内存,但事实并非如此。所以,例如:

NSArray *array = @[@"111", @"111"];
NSArray *array1 = array.copy;
NSMutableArray *array2 = array.copy;
NSMutableArray *array3 = array.mutableCopy;
NSArray *array4 = array.mutableCopy;

仅为array3和array4分配的新内存。所以,我可以简单地为array1和array2做:

NSArray *array1 = array;
NSMutableArray *array2 = array;

当我可以使用copy时,它只会生成不可变的array2,这对我有用吗?

2 个答案:

答案 0 :(得分:8)

在Cocoa中,copy方法可以非常智能:如果一个对象是 immutable ,它可以在不复制的情况下自行返回,因为复制无法复制的对象没有意义改变了。在您的示例中,NSArray是不可变的,NSMutableArray是可变的。这就是为什么只有可变对象进行实际复制的原因。当然,所有可变副本也必须分配新内存。

答案 1 :(得分:0)

之间有区别:

NSArray *array1 = array.copy;

NSArray *array1 = array;

在第一种情况下,array的保留计数增加。在第二个它不是。因此,如果您发布arrayarray1可能会在第二种情况下失效,而在第一种情况下它仍然有效。

确切的后果可能取决于您使用ARC或手动引用计数。

无论如何都会复制可变对象,这样您就可以在不影响副本的情况下修改原始对象。对于不可变对象,这是不必要的,因为它们无法修改。