1

私は2つのnsmutablearrayを持っています:

@property (nonatomic, strong) NSMutableArray *calSeries;
@property (nonatomic, strong) NSMutableArray *calSeries2Copy;

それから私はこれをします:

self.calSeries = [self getSeries];
self.calSeries2Copy = [NSMutableArray arrayWithArray:self.calSeries];

コア データからの getSeries メソッド fetchObject ですが、calSeries の要素を変更すると、calSeries2Copy でも変更されます。2 つの配列を別々に作成して、1 つの配列の要素を変更しても、他の配列?

4

2 に答える 2

3

これを試して、

self.calSeries2Copy = [[NSMutableArray alloc] initWithArray:self.calSeries copyItems:YES];

documentationに従って、NSCopyingプロトコルを実装している場合、これはコピーする必要があります。

国旗

YES の場合、配列内の各オブジェクトは copyWithZone: メッセージを受け取り、オブジェクトのコピーを作成します。オブジェクトは NSCopying プロトコルに準拠する必要があります。マネージ メモリ環境では、これはオブジェクトが受信する保持メッセージの代わりになります。オブジェクトのコピーは、返された配列に追加されます。

NO の場合、マネージ メモリ環境では、配列内の各オブジェクトは、返された配列に追加されるときに保持メッセージを受け取るだけです。

討論

この方法で不変配列を初期化すると、変更できなくなります。

copyWithZone: メソッドは浅いコピーを実行します。任意の深さのコレクションがある場合、flag パラメータに YES を渡すと、サーフェスの下の最初のレベルの不変のコピーが実行されます。NO を渡すと、最初のレベルの可変性は影響を受けません。どちらの場合でも、すべてのより深いレベルの可変性は影響を受けません。

于 2012-12-09T11:02:57.860 に答える
0

デフォルトで配列をコピーすると、浅いコピーのみが作成されます。これは、配列はコピーされますが、要素はもう一度だけ保持されることを意味します

アイテムをコピーして、すべての要素もコピーされるディープコピー[[NSMutableArray alloc] initWithArray:srcArray copyItems:YES];を取得します

于 2012-12-09T11:06:13.297 に答える