Objective-c NSArray init 与 initWithCapacity:0

Posted

技术标签:

【中文标题】Objective-c NSArray init 与 initWithCapacity:0【英文标题】:Objective-c NSArray init versus initWithCapacity:0 【发布时间】:2011-08-29 23:07:40 【问题描述】:

[[NSMutableArray alloc] init];

[[NSMutableArray alloc] initWithCapacity:0];

编译成完全相同的东西?

如果它们不同,那么在内存和运行时性能方面如何以及哪种形式“更好”?

【问题讨论】:

在不知道实现细节的情况下,我希望能够相信并说基金会团队使两者之间的性能差异可以忽略不计。从个人观点来看,我认为最好的做法是在有意义的情况下调用类提供的任何初始化程序而不是通用初始化程序。由于 NSMutableArray 公开声明 initWithCapacity 并且只继承 init 我倾向于使用 initWithCapacity。另外,为什么不编写一个循环,使用 init 和 initWithCapacity 分析大量可变数组创建并添加您的观察结果。 另见NSMutableArray initWithCapacity nuances。 提防过早优化。 关于 NSArray 性能的有趣读物:"Our Arrays, Aren't" by Ridiculous Fish。 @乔 【参考方案1】:

不,它们的行为不会相同。 init 将创建一个具有一些未知但很可能是非零容量的数组——无论作者认为对于大多数情况来说都是合理的默认值。 initWithCapacity:0 将请求一个绝对没有分配空间的数组。这意味着什么取决于 NSMutableArray 实现:它可能不允许容量为 0 并且行为与 init 完全相同,或者它可能不会立即分配任何东西而是分配一些数量(可能与 init 相同,或者可能不是)当你第一次需要它时。

哪个会执行“更好”完全取决于您期望如何使用数组。 -init 说“我对这个数组没有任何期望;我要么在其中添加和删除很多,要么它可能非常小。” -initWithCapacity: 说“我希望这个数组在可预见的未来不会超过这么多元素。”

关于我认为initWithCapacity:0 合理的唯一地方是,如果您正在创建一个您不希望在相当长的一段时间内填充任何内容的数组。

请注意,此处适用标准性能警告:除非您分析并确定它可能不是问题,否则它可能不是问题。我真的无法想象这两者之间的差异会很大的情况(除了成千上万的NSMutableArray 对象)。

【讨论】:

+1 请注意,使用 initWithCapacity:n 并不妨碍您向数组中添加超过 n 个对象。这只是一个建议,所以NSArray 可以尝试在后台进行一些优化。 另请参阅 Matt Gallagher 的 this blog post

以上是关于Objective-c NSArray init 与 initWithCapacity:0的主要内容,如果未能解决你的问题,请参考以下文章

NSArray怎么转换为NSData

Objective-C 正确复制一个 NSArray?

objective-c 空 NSArray 错误

按二维排序 NSArray - Objective-C

在 Objective-c 中访问二维 NSArray 中的值

Objective-C中NSArray和NSMutableArray是如何使用的?