1. ホーム
  2. objective-c

[解決済み] NSArrayのディープコピー

2022-08-18 23:31:02

質問

をディープコピーするための組み込み関数はありますか? NSMutableArray ?

いろいろ調べてみると、ある人は [aMutableArray copyWithZone:nil] はディープコピーとして機能すると言う人もいます。しかし、私は試してみたが、それは浅いコピーであるように思われる。

今現在、私は手動でコピーする際に for ループでコピーしています。

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

が、もっとすっきりした簡潔な解答が欲しいところです。

どのように解決するのですか?

として ディープコピーに関するAppleのドキュメント が明示的に述べています。

が必要なだけなら 1レベルの深さの をコピーしてください。

NSMutableArray *newArray = [[NSMutableArray alloc] 
                             initWithArray:oldArray copyItems:YES];

上記のコードでは、古い配列のメンバを浅くコピーした新しい配列を作成しています。

ネストされたデータ構造全体を深くコピーする必要がある場合、リンク先の Apple ドキュメントでは 真のディープ コピー - と呼んでいます。それについては、ここの他の回答を参照してください。