あなたは最初のケースで正しいですNSString
。可変サブクラス ( NSMutableString
)があるため、コピーは便利です。
(詳細: について話すと、主にプロパティで使用されますが、コードがどのように構造化されているかによって、ローカル変数でも役立つ場合があります)copy
NSString
*name
NSString
copy
しかし、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
) 別の参照があり、この最後の参照が削除されるまで解放されません。
最後に: あなたの例にはローカル変数しかないため、ここで作成されたすべての強い参照は、メソッドの終了後に失われます (ローカル変数が破棄されるため)。参照されたオブジェクトは、コードの他の部分に他の強い参照がない場合、割り当てが解除されます。