2013-03-30 29 views
3

我试图了解何时需要使用copy?我认为copy分配新的内存,但它不。因此,例如:当我需要使用复制?

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

分配给array3和array4的新内存。所以,我可以做数组1和数组2只是:

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

当我可以使用复制的,它只是让一成不变的数组2,到时将是有益的给我吗?

+0

我认为你缺少的是'copy'增加了不可变对象的保留数,并且实际上为可变对象创建了一个副本。因此,在ARC之下它不像以前那么必要。 –

回答

8

在Cocoa中,该copy方法可以是非常聪明的:如果对象是不可改变,它可以返回本身不进行复制,因为在复制不能更改的对象是没有意义的。在你的例子中,NSArray是不可变的,并且NSMutableArray是可变的。这就是为什么只有可变对象才能进行实际的复制。当然,所有可变副本也必须分配新的内存。

0

之间有一个区别:

NSArray *array1 = array.copy; 

NSArray *array1 = array; 

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

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

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