6

可能重复:
NSMutableArray initWithCapacity 细微差别
Objective-c NSArray init 与 initWithCapacity:0

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

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

2 回答 2

8

从功能上讲,这两个语句是相同的。

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

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

于 2012-08-07T14:27:20.897 回答
5

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

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

来自苹果的文档

arrayWithCapacity:

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

于 2012-08-07T14:26:59.100 回答