2

場合によっては、いくつかの条件下で配列を「ロード」する必要があります。したがって、for ループがあり、オブジェクトを一時的な NSMutableArray に追加します。

しかし、アセンブル プロセスが完了し、プロパティに静的配列が必要な場合はどうすればよいでしょうか?

  • NSArray プロパティのテンポラリを設定する必要がありますか?
  • NSMutableArray の copy メソッドを使用してプロパティにコピーする必要がありますか?
  • 使用する必要があります[[NSArray alloc] initWithArray:tempArray]か?
  • を使用する必要がありますか?[NSArray arrayWithArray:tempArray]違いはありinitますか?

続行するための最良の方法 (パフォーマンスとメモリ) は何ですか?

4

3 に答える 3

3

一般に、NSArray プロパティをプロパティにすることをお勧めしcopyます。したがって、ほとんどの場合、単にself.myProperty = temporaryArray. 通常、このようなメモリ管理の問題はアクセサに任せて、責任が小さな領域に集中するようにするのが最善です。

于 2013-09-12T17:00:24.703 に答える
2

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)
于 2013-09-12T16:57:21.657 に答える