使用和不使用容量初始化NSMutableArray

时间:2012-08-07 14:21:15

标签: objective-c xcode nsmutablearray

  

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

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

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

2 个答案:

答案 0 :(得分:8)

从功能上讲,两种陈述都是相同的。

在第一种情况下,您给运行时提供一个提示,即您很快就会向数组中添加五个对象,以便它可以(如果愿意的话)为它们预分配一些空间。这意味着使用第一个语句可以略微加快前五个addObject:调用。

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

答案 1 :(得分:5)

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

以另一种方式设置这个想象你有一个对象在内存中请求5个空格(就像你的第一个例子),第二个对象不保留任何空间。因此,当需要将对象添加到第一个对象时,内存中已经存在空间以使其刚好落入,另一方面,非分配对象首先必须请求内存空间然后将其添加到阵列。这在这个级别听起来并不是那么糟糕,但是当你的阵列数量增加时,这变得更加重要。

来自Apple's documentation

arrayWithCapacity:

  

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