0

SBJson を使用して JSON 文字列を解析しています。

このような:

NSDictionary *dict = received_notification.object;

使うべきか

NSString *name  = [[dict valueForKey:@"name"] copy];

また

NSString *name  = [dict valueForKey:@"name"];

最初のメソッドは NSString をコピーし、その後 dict を解放できると思います。

しかし、2 番目の式 "name" は dict への参照を保持しており、解放することはできません。

私が間違っている?

4

1 に答える 1

7

あなたは最初のケースで正しいですNSString。可変サブクラス ( NSMutableString)があるため、コピーは便利です。 (詳細: について話すと、主にプロパティで使用されますが、コードがどのように構造化されているかによって、ローカル変数でも役立つ場合があります)copyNSString*name
NSStringcopy

しかし、2 番目のケースでは、あなたは間違っています。最初に: ARC を使用しているため (投稿には記載されていませんが、タグが表示されます)、すべてのローカル変数は__strongデフォルトで

あなたがするとき:

NSString *name = [dict objectForKey:@"name"]; // use objectForKey since valueForKey is for KVC, as suggested by Martin R

辞書への参照を取得していませんが、辞書内のキー「名前」でオブジェクトへの参照を取得しています(これは である必要がありますNSString)。そのため、ARC は にretainメッセージを自動的に送信しますNSString。その時点で、その文字列は少なくとも2 つのものによって強く参照され
ます 。*name
NSDictionary

ディクショナリの割り当てが解除された場合、NSStringインスタンスには (からの*name) 別の参照があり、この最後の参照が削除されるまで解放されません。

最後に: あなたの例にはローカル変数しかないため、ここで作成されたすべての強い参照は、メソッドの終了後に失われます (ローカル変数が破棄されるため)。参照されたオブジェクトは、コードの他の部分に他の強い参照がない場合、割り当てが解除されます。

于 2013-08-09T11:02:34.817 に答える