【问题标题】:Initializing NSMutableArray with and without capacity [duplicate]使用和不使用容量初始化 NSMutableArray [重复]
【发布时间】:2012-08-04 14:11:49
【问题描述】:

可能重复:
NSMutableArray initWithCapacity nuances
Objective-c NSArray init versus initWithCapacity:0

下面这行代码有什么区别?确切的优点和缺点是什么?假设接下来我会做 3 个 addObject 操作。

NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity: 5];
NSMutableArray *array = [[NSMutableArray alloc] init];

【问题讨论】:

标签: objective-c xcode nsmutablearray


【解决方案1】:

两个语句在功能上是相同的。

在第一种情况下,您正在向运行时提示您将很快将五个对象添加到数组中,以便它可以根据需要为它们预分配一些空间。这意味着前五个addObject: 调用使用第一条语句可能会稍微快一些。

但是,除了忽略提示之外,不能保证运行时会执行任何操作。我自己从不使用initWithCapacity:。如果我遇到addObject: 是一个重要的性能瓶颈的情况,我可能会尝试看看情况是否有所改善。

【讨论】:

  • 对——或者说直白点:不要理会暗示的版本。
【解决方案2】:

通常,面向对象语言和不同大小的数组的区别在于:您将获得的开销和内存级别的页面错误。

换句话说,假设您有一个对象在内存中请求 5 个空间(就像您的第一个示例一样),而第二个对象不保留任何空间。因此,当需要将一个对象添加到第一个对象时,内存中已经有空间让它落入,另一方面,非分配对象首先必须请求内存空间然后将其添加到大批。在这个级别上这听起来并没有那么糟糕,但是当您的数组大小增加时,这变得更加重要。

来自Apple's documentation

arrayWithCapacity:

创建并返回一个 NSMutableArray 对象 足够分配的内存来最初保存给定数量的对象。 ... 新阵列的初始容量。返回值 一个新的 NSMutableArray 对象 分配的内存足以容纳 numItems 个对象。

【讨论】:

  • 一个不错的猜测,但事实并非如此......请参阅 Jeremy 的回答。
  • @bbum 我认为这不是猜测。这是一个恰当的解释。在杰里米的回答中,他使用了可能。
  • @Saad 不,真的,这是一个猜测。阅读源代码(CFFoundation 是开源的)。如果您请求一个具有 100,000 个插槽的数组,它不一定会提前分配所有这些插槽。数据结构比平面数组复杂一些,因此文档具有误导性,但并非完全错误。
猜你喜欢
  • 2014-03-09
  • 2012-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-29
  • 2016-06-23
  • 2023-04-03
  • 1970-01-01
相关资源
最近更新 更多