NSMutableArray
は のサブクラスでNSArray
あるため、最も簡単な方法は、可変配列を (可変でない)NSArray*
変数に割り当てることです。ただし、Objective-C のランタイム ダイナミズムにより、コードの形式が適切でない場合、静的であると予想されるこの配列を誤って変更してしまう可能性があります。配列の変更不可能なコピーを作成すると、そのような偶発的な呼び出しにより、プログラムがクラッシュします。
NSMutableArray
の-copy
メソッドは変更可能なコピーを返す必要があるため、これはあなたがやりたいことではないと思います。あなたが書いた最後の 2 つのオプションは、ARC の最適化の下では同等です。違いは+arrayWithArray:
、自動解放されたオブジェクトを返すのに対し-initWithArray:
、保持されたオブジェクトを返すことです。
NSMutableArray
次のようなメソッドを誤って呼び出した場合の違いの例を次に示します-removeAllObjects
。
NSMutableArray *tempArray = [NSMutableArray arrayWithCapacity:n];
for (int i = 0; i != n; ++i) {
// add object to tempArray
[tempArray addObject:[NSNumber numberWithInt:n];
}
// option 1:
[self setArray:tempArray];
[[self array] removeAllObjects]; // succeeds (that's bad)
// option 2:
[self setArray:[tempArray copy]];
[[self array] removeAllObjects]; // succeeds (that's bad)
// option 3:
NSArray *immutableArray = [[NSArray alloc] initWithArray:tempArray];
[self setArray:immutableArray];
[[self array] removeAllObjects]; // fails (that's good)
// if not ARC: [immutableArray release];
// option 4:
NSArray *immutableArray = [NSArray arrayWithArray:tempArray];
[self setArray:immutableArray];
[[self array] removeAllObjects]; // fails (that's good)