2012-10-30 40 views
2

我有一個NSMutableArray的自定義對象(基於NSObject),我想複製到一個新的數組。但我希望它是一個深層次的副本。自定義類的NSMutableArray複製

我該如何去做這件事?我需要在自定義對象中實現NSCopying協議嗎?

感謝

回答

5

是的,你需要表明您的自定義類附着在NSCopying協議,然後你實現copyWithZone:方法。這可以讓你的課程被複制。在執行copyWithZone:時,您需要確定有多少內部組件還需要進行深度複製。

現在,如果您對數組執行深層複製,則新數組將包含對象的複製版本,而不僅僅是對原始引用的引用。

請注意,數組的常規副本不會執行深層複製。要製作較深的副本,您需要如下所示的內容:

NSArray *deepCopyArray=[[NSArray alloc] initWithArray:someArray copyItems:YES]; 
+0

不,調用陣列上的副本不會進行深層複製,無論包含的元素實現什麼協議 – Eiko

+0

@Eiko我從來沒有說過在一個陣列上調用'copy'會產生深層副本。我說過如何確保自定義對象是可複製的。然後我提到,如果數組的深層拷貝被製作出來...... – rmaddy

+1

@maddy嗯,好吧,我想「現在如果你做了一個數組的深層拷貝,......」很容易被誤解。 – Eiko

1

深度複製數組可以通過手動檢查所有元素來完成。如果對象需要進一步深度複製,則這是必需的。

NSMutableArray *deepCopied = [NSMutableArray arrayWithCapacity:[array count]]; 

// assumes your objects know how to "deepCopy"     
for (id object in array) 
{ 
    // if not ARC or GC: 
    [deepCopied addObject:[[object deepCopy] aurorelease]]; 

    // if ARC or GC 
    [deepCopied addObject:[object deepCopy]]; 
} 

否則:

NSArray *deepCopied = [[NSArray alloc] initWithArray:array copyItems:YES]; 

有在回答中here如果你需要做大量的深拷貝,可以幫助描述一個類中的方法。

相關問題