【问题标题】:Should I release an NSDictionary instantiated through the form @{}?我应该发布一个通过@{} 形式实例化的 NSDictionary 吗?
【发布时间】:2014-06-29 07:44:10
【问题描述】:

我有以下代码:

NSDictionary *dict = @{ @"myKey" : @"myValue" };  

我应该使用release 还是autorelease 释放dict
或者我不拥有该对象,所以我不应该自己释放它?

注意:我使用手动引用计数(ARC 已禁用)。

【问题讨论】:

标签: ios macos cocoa memory-management reference-counting


【解决方案1】:

不,您不得发布使用文字语法创建的NSDictionaryClang documentation 告诉字典文字表达式扩展为 +[NSDictionary dictionaryWithObjects:forKeys:count:],因此您不拥有该对象。

没有 Objective-C 文字扩展为创建拥有引用的表达式。

【讨论】:

  • 自提供官方文档链接以来对我来说是最佳答案。谢谢!
【解决方案2】:

即使您禁用了 ARC(您应该启用它),您也不需要释放它,因为您不拥有该对象。只有当您通过allocnew 创建对象时,您才拥有该对象。

【讨论】:

  • 我在我的问题中添加了一条注释。 ARC(已禁用)。感谢您的快速回答!
【解决方案3】:

我问得太早了,抱歉。但这是答案:

我尝试自己分析它,因为我找不到参考资料(可能是因为模糊的关键字@{})。

autorelease 添加到@{ @"myKey" : @"myValue" } 创建的字典时,应用程序崩溃。我还通过 Xcode 的静态分析器运行了代码,它给出了内存问题。
因此,我们不需要释放使用@{} 检索的对象,类似于@"" 中的NSString

我还使用@[] 尝试了NSArray。同样的行为也适用。
我们不需要自己释放它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 2014-04-12
    • 2016-05-01
    相关资源
    最近更新 更多