我有一個NSMutableArray的自定義對象(基於NSObject),我想複製到一個新的數組。但我希望它是一個深層次的副本。自定義類的NSMutableArray複製
我該如何去做這件事?我需要在自定義對象中實現NSCopying協議嗎?
感謝
我有一個NSMutableArray的自定義對象(基於NSObject),我想複製到一個新的數組。但我希望它是一個深層次的副本。自定義類的NSMutableArray複製
我該如何去做這件事?我需要在自定義對象中實現NSCopying協議嗎?
感謝
是的,你需要表明您的自定義類附着在NSCopying
協議,然後你實現copyWithZone:
方法。這可以讓你的課程被複制。在執行copyWithZone:
時,您需要確定有多少內部組件還需要進行深度複製。
現在,如果您對數組執行深層複製,則新數組將包含對象的複製版本,而不僅僅是對原始引用的引用。
請注意,數組的常規副本不會執行深層複製。要製作較深的副本,您需要如下所示的內容:
NSArray *deepCopyArray=[[NSArray alloc] initWithArray:someArray copyItems:YES];
深度複製數組可以通過手動檢查所有元素來完成。如果對象需要進一步深度複製,則這是必需的。
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如果你需要做大量的深拷貝,可以幫助描述一個類中的方法。
不,調用陣列上的副本不會進行深層複製,無論包含的元素實現什麼協議 – Eiko
@Eiko我從來沒有說過在一個陣列上調用'copy'會產生深層副本。我說過如何確保自定義對象是可複製的。然後我提到,如果數組的深層拷貝被製作出來...... – rmaddy
@maddy嗯,好吧,我想「現在如果你做了一個數組的深層拷貝,......」很容易被誤解。 – Eiko