我尝试了解何时需要使用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,这对我有用吗?
答案 0 :(得分:8)
在Cocoa中,copy
方法可以非常智能:如果一个对象是 immutable ,它可以在不复制的情况下自行返回,因为复制无法复制的对象没有意义改变了。在您的示例中,NSArray
是不可变的,NSMutableArray
是可变的。这就是为什么只有可变对象进行实际复制的原因。当然,所有可变副本也必须分配新内存。
答案 1 :(得分:0)
之间有区别:
NSArray *array1 = array.copy;
和
NSArray *array1 = array;
在第一种情况下,array
的保留计数增加。在第二个它不是。因此,如果您发布array
,array1
可能会在第二种情况下失效,而在第一种情况下它仍然有效。
确切的后果可能取决于您使用ARC或手动引用计数。
无论如何都会复制可变对象,这样您就可以在不影响副本的情况下修改原始对象。对于不可变对象,这是不必要的,因为它们无法修改。