0

ループ内で NSMutableDictionary にいくつかの値を設定しようとしており、以下のように毎回辞書の値を NSMutableArray に割り当てています。

for(int i=0;i<=lastObj;i++){
[mutableDict setValue:[valuesArray objectAtIndex:i] forKey:@"Name"];
[mutableDict setValue:[uniqueArray objectAtIndex:i] forKey:@"SSN"];
//......then
**[mutableArray addObject:mutableDict];**/*not working perfectly all values s replaced by final mutableDict values (duplicate values)*/

しかし

**[mutableArray addObject:[mutableDict copy]];**/* Working Correctly !!! */
}

各反復のループ内で新しい値が mutableDictionary に割り当てられ、addObject とだけ言うと、mutableArray はすべての重複値を取得しますが、addObject:[mutableDict copy ] と言うたびに、配列は重複のない正しい一意の値を取得します。わかりません私が「コピー」と言うと、コンパイラーはどのような違いを感じますか?この違いを誰か教えてください。前もって感謝します。

4

2 に答える 2

4
[mutableArray addObject:mutableDict];

mutableDict を mutableArray に追加し続けます。オブジェクトを追加しても、新しいメモリ ロケーションは作成されず、同じメモリを指します。そのため、mutableDict の値を設定すると、同じメモリ位置を参照するため、追加されたすべてのオブジェクトに反映されます。

copy は新しいメモリ ロケーションを作成し、上記のシナリオを削除するオブジェクトを追加します。

これを避けるために追加できます

for(int i=0;i<=lastObj;i++){
NSMutableDictionary * mutableDict = [NSMutableDictionary new]; //create new memory location
[mutableDict setValue:[valuesArray objectAtIndex:i] forKey:@"Name"];
[mutableDict setValue:[uniqueArray objectAtIndex:i] forKey:@"SSN"];

[mutableArray addObject:mutableDict];
[mutableDict release]; //release 
}

これがあなたを助けることを願っています。幸せなコーディング:)

于 2012-05-10T10:47:07.993 に答える
1

コードブロックを見ると、 for ループの外側に mutableDict を割り当てていることが明らかです。したがって、forループ内で以下のステートメントを言うと、基本的に同じオブジェクトをmutalbeArrayに追加して渡します。

[mutableArray addObject:mutableDict];

addObject はオブジェクトにメモリを割り当てませんが、渡された同じオブジェクトを使用し、「retain」メッセージを送信して参照カウントを増やします。for ループ内で同じオブジェクトを渡しているため、mutalbeArray には同じオブジェクトへの参照が含まれます。

コピーの場合は、

[mutableArray addObject:[mutableDict コピー]];

mutableDict に送信されたコピー メッセージは新しいコピーを返し、それが addObject に渡されます。したがって、forloop のすべての反復は、新しいオブジェクト (コピーによる) を addObject に渡します。

また、これらの次の点に注意してください

  1. Copy は新しいオブジェクトを作成し、後でリリースする必要がありますが、コードはそれをリリースしていません。これにより、メモリ リークが発生します。
  2. Copy は不変オブジェクトを作成するため、mutableArray に追加されたオブジェクトを変更する場合は、代わりに mutableCopy を使用する必要があります。
于 2012-05-10T11:56:40.917 に答える