第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

深度復(fù)制NSArray

深度復(fù)制NSArray

暮色呼如 2019-08-31 11:11:51
是否有任何內(nèi)置功能可以讓我深層復(fù)制NSMutableArray?我環(huán)顧四周,有些人說[aMutableArray copyWithZone:nil]是深刻的副本。但我試過,它似乎是一個淺薄的副本?,F(xiàn)在我用for循環(huán)手動執(zhí)行復(fù)制://deep copy a 9*9 mutable array to a passed-in reference array-deepMuCopy : (NSMutableArray*) array     toNewArray : (NSMutableArray*) arrayNew {    [arrayNew removeAllObjects];//ensure it's clean    for (int y = 0; y<9; y++) {        [arrayNew addObject:[NSMutableArray new]];        for (int x = 0; x<9; x++) {            [[arrayNew objectAtIndex:y] addObject:[NSMutableArray new]];            NSMutableArray *aDomain = [[array objectAtIndex:y] objectAtIndex:x];            for (int i = 0; i<[aDomain count]; i++) {                //copy object by object                NSNumber* n = [NSNumber numberWithInt:[[aDomain objectAtIndex:i] intValue]];                [[[arrayNew objectAtIndex:y] objectAtIndex:x] addObject:n];            }        }    }}但我想要一個更清潔,更簡潔的解決方案。
查看完整描述

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文檔稱之為“真正的深層副本” - 那么這種方法是不夠的 - 請參閱此處的其他答案。


查看完整回答
反對 回復(fù) 2019-08-31
?
元芳怎么了

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))


查看完整回答
反對 回復(fù) 2019-08-31
?
楊__羊羊

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]];



查看完整回答
反對 回復(fù) 2019-08-31
  • 3 回答
  • 0 關(guān)注
  • 742 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號