3 回答

TA貢獻2065條經(jīng)驗 獲得超14個贊
正如Apple文檔所述,
如果您只需要一個級別深的副本,您可以明確地要求一個...
NSMutableArray *newArray = [[NSMutableArray alloc]
initWithArray:oldArray copyItems:YES];
上面的代碼創(chuàng)建了一個新數(shù)組,其成員是舊數(shù)組成員的淺表副本。
請注意,如果您需要深度復(fù)制整個嵌套數(shù)據(jù)結(jié)構(gòu) - 鏈接的Apple文檔稱之為“真正的深層副本” - 那么這種方法是不夠的 - 請參閱此處的其他答案。

TA貢獻1798條經(jīng)驗 獲得超7個贊
我知道輕松做到這一點的唯一方法是歸檔然后立即取消歸檔你的數(shù)組。這感覺有點像黑客,但實際上在Apple文檔中明確建議復(fù)制集合,其中指出:
如果您需要真正的深層副本,例如當(dāng)您擁有陣列數(shù)組時,只要內(nèi)容全部符合NSCoding協(xié)議,您就可以歸檔然后取消歸檔該集合。清單3顯示了這種技術(shù)的一個例子。
清單3真正的深層副本
NSArray* trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:
[NSKeyedArchiver archivedDataWithRootObject:oldArray]];
問題是您的對象必須支持NSCoding接口,因為這將用于存儲/加載數(shù)據(jù)。
Swift 2版本:
let trueDeepCopyArray = NSKeyedUnarchiver.unarchiveObjectWithData(
NSKeyedArchiver.archivedDataWithRootObject(oldArray))

TA貢獻1943條經(jīng)驗 獲得超7個贊
默認情況下復(fù)制會生成淺表副本
這是因為調(diào)用與使用默認區(qū)域進行復(fù)制copy相同copyWithZone:NULL。該copy調(diào)用不會導(dǎo)致深層復(fù)制。在大多數(shù)情況下,它會給你一個淺的副本,但無論如何它取決于類。有關(guān)詳細討論,我建議Apple Developer站點上的Collections Programming Topics。
initWithArray:CopyItems:提供一個級別的深層副本
NSArray *deepCopyArray = [[NSArray alloc] initWithArray:someArray copyItems:YES];
NSCoding 是Apple推薦的提供深層復(fù)制的方式
對于真正的深層副本(數(shù)組數(shù)組),您將需要NSCoding并歸檔/取消歸檔對象:
NSArray *trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:oldArray]];
- 3 回答
- 0 關(guān)注
- 742 瀏覽
添加回答
舉報