理解NSMutableArray上的arrayWithCapacity:方法

时间:2014-03-14 04:12:36

标签: objective-c nsmutablearray nsrangeexception

我很难尝试理解Objective-C的NSMutableArray类中的方法。我使用此类的arrayWithCapacity:static方法创建了一个数组,如下所示:

NSMutableArray * myArray = [NSMutableArray arrayWithCapacity: 10];

然后我尝试访问数组中的元素:

id myVariable = myArray[5];

这就是我得到的:

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 5 beyond bounds for empty array'

为什么会这样?我是否误解了方法描述的任何内容?

感谢您的帮助。

2 个答案:

答案 0 :(得分:14)

使用arrayWithCapacity:10意味着在内部,数组将自己设置为容纳10个对象。但它仍然没有任何对象。

通常,会创建一个空数组并设置为仅包含几个对象。当您添加越来越多的对象时,需要调整内部数组的大小。这意味着需要对更多内存进行malloced,然后将旧对象移动到新内存,并清除旧内存。

如果您知道数组将包含X个对象,则使用arrayWithCapacity可以使数组更有效。您仍然可以添加更多对象,但效率将会丢失。

除此之外,您无法访问超出当前计数的数组索引。由于计数最初为0,因此您无法访问任何对象。您需要先添加对象才能访问它们。

答案 1 :(得分:-3)

您已初始化数组,如:

NSMutableArray * myArray = [NSMutableArray arrayWithCapacity: 10];

这意味着您最多可以向数组中添加10个对象。你正在访问数组的第六个对象:

id myVariable = myArray[5];

我不知道你是如何将对象添加到数组中但是从错误中看起来你的数组似乎没有对象而你正在尝试访问空数组的第六个索引。尝试先添加一些对象。