0

我正在使用 SBJson 来解析 JSON 字符串。

像这样:

NSDictionary *dict = received_notification.object;

我应该使用

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

或者

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

我认为第一种方法复制 NSString ,然后可以释放 dict 。

但是对于第二个表达式,“name”保留了对 dict 的引用,并且无法释放。

我错了吗?

4

1 回答 1

7

在第一种情况下你是对的,复制可能很有用,因为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),并且在删除最后一个引用之前不会被释放。

最后一件事:由于在您的示例中只有局部变量,因此在方法结束后在此处创建的所有强引用都将丢失(因为局部变量已被破坏)。如果引用的对象在代码的其他部分没有其他强引用,则它们将被释放。

于 2013-08-09T11:02:34.817 回答