在第一种情况下你是对的,复制可能很有用,因为NSString
它有一个可变的子类(NSMutableString
),所以copy
确保你有一个真实NSString
的 in*name
而不是它的可变子类。
(更多:谈论NSString
,copy
主要用于属性,但根据结构的不同,您的代码即使在局部变量上也很有用)
但在第二种情况下,你错了。第一件事:您使用的是 ARC(帖子中没有提到,但我看到了标签),所以__strong
默认情况下所有局部变量都是
当你这样做时:
NSString *name = [dict objectForKey:@"name"]; // use objectForKey since valueForKey is for KVC, as suggested by Martin R
您没有引用字典,而是引用字典内键“名称”处的对象(应该是NSString
)。因此,ARCretain
会自动向NSString
. 在那一刻,该字符串至少被两件事强烈引用:
-您的*name
指针
-NSDictionary
如果您的字典被解除分配,则该NSString
实例具有另一个引用(来自*name
),并且在删除最后一个引用之前不会被释放。
最后一件事:由于在您的示例中只有局部变量,因此在方法结束后在此处创建的所有强引用都将丢失(因为局部变量已被破坏)。如果引用的对象在代码的其他部分没有其他强引用,则它们将被释放。