2013-03-30 59 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或手動引用計數。

無論如何都會複製可變對象,以便您可以在不影響副本的情況下修改原件。這對於不可變對象是不必要的,因爲它們不能被修改。