【问题标题】:Creating an NSMutableArray with a literal via mutableCopy or arrayWithArray: [duplicate]通过 mutableCopy 或 arrayWithArray 创建带有文字的 NSMutableArray:[重复]
【发布时间】:2012-09-20 14:15:47
【问题描述】:

可能重复:
Is literal creation of an NSMutableDictionary less efficient than the class helper method?

根据介绍 ObjectiveC 文字的 WWDC 视频,NSMutableArrays 可以这样初始化:

[NSMutableArray arrayWithArray:@[]];

但是如果我们这样做呢:

[@[] mutableCopy];

我知道一个是初始化数组,另一个只是提供浅拷贝;因此内存管理是不同的。但是如果我们使用ARC,那么使用后者有什么缺点呢?它更贵吗? ARC 的处理方式可能不同,但我只是想知道使用 mutableCopy 是否“更糟”。

【问题讨论】:

  • [NSMutableArray array] 呢?

标签: objective-c cocoa memory-management objective-c-literals


【解决方案1】:

在前一种情况下,您最终会在当前自动释放池中添加两个对象:NSArray 字面量和您从中创建的 NSMutableArray。在后者中,文字 NSArray 被添加到自动释放池中,但从中复制的 NSMutableArray 没有。所以第一种情况在性能方面稍微更糟,因为耗尽自动释放池(例如在运行循环周期结束时)需要连续释放两个对象,而在第二种情况下副本将与自动发布的文字分开发布。在实践中,时间差将是无限小的。

【讨论】:

  • 有趣!这解释了很多。谢谢。
  • 在 ARC 下,不需要的自动发布通常会被优化掉,因此即使这样也可能不是主要问题。
  • 不一定是这样。我上次测试时,Foundation 似乎没有用 ARC 编译。这很重要,因为在使用 ARC 编译时,clang 不会插入 return [retVal autorelease]; - 它实际上会插入 return objc_autoreleaseReturnValue(retVal);。同样,调用者(您的代码)不会在结果上调用-retain,而是调用objc_retainAutoreleasedReturnValue。围绕该方法返回的这两个函数的组合导致对象实际上从未进入自动释放池。否则,它仍然会在那里结束。
猜你喜欢
  • 2011-04-14
  • 1970-01-01
  • 2023-03-29
  • 2013-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多