1

mutableCopyを使用してNSMutableArrayをコピーすると、アレイの物理的な新しいコピーが作成されるようです。これの証拠は、removeObjectAtIndexを使用してコピーから要素を削除しても、元の要素は削除されないことです。ただし、コピーの要素が変更されると、元の要素も変更されます。これは、光の光子が粒子と波の両方であるのと同じくらい直感的であり、私はそれを理解していません。誰かが私にこれを説明できますか?

コードは次のとおりです。

NSMutableArray *dataArray = [NSMutableArray arrayWithObjects:
                                 [NSMutableString stringWithString:@"one"],
                                 [NSMutableString stringWithString:@"two"],
                                 [NSMutableString stringWithString:@"three"],
                                 [NSMutableString stringWithString:@"four"],
                                 nil];
    NSMutableArray *dataArray2;
    NSMutableString *mstr;
    dataArray2 = [dataArray mutableCopy];
    [dataArray2 removeObjectAtIndex:0];
    mstr    = [dataArray2 objectAtIndex:0];
    [mstr appendString:@"ONE"];
    NSLog(@"Data Array: ");
    for (NSString *elem in dataArray) {
        NSLog(@"%@",elem);
    }
    NSLog(@"Data Array2: ");
    for (NSString *elem in dataArray2) {
        NSLog(@"%@",elem);
    } 
4

2 に答える 2

1

このmutableCopyメソッドは、配列の浅いコピーを作成します。つまり、元の配列の要素への参照は、NSMutableArrayによって返されるの新しいインスタンスにコピーされmutableCopyます。そのため、配列のコピーを操作(要素の追加/削除)しても元の配列の構成は変更されませんが、配列の両方のコピーを通じて突然変異を許可する配列の要素への変更が「表示」されます。

于 2012-11-12T12:33:37.917 に答える
0

配列オブジェクトを変更するのか、それとも参照するオブジェクトの1つを変更するのかが問題になります。

コンピュータ以外の世界では、2枚の異なる紙に人の名前のリストがあると仮定します。一方のリストから名前を削除しても、もう一方には影響しません。代わりに、あなたがそれらの人々の1人に一杯のコーヒーを与える場合、あなたがリストAまたはリストBでそれらを調べても、その人はそれを持っています。:-)

于 2012-11-12T12:34:19.313 に答える