理解NSMutableArray的arrayWithCapacity:方法

4

我很难理解Objective-C的NSMutableArray类中的一个方法。我使用该类的arrayWithCapacity:静态方法创建了一个数组,就像这样:

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个回答

16

使用 arrayWithCapacity:10 表示数组内部将设置为容纳 10 个对象。但它仍然没有任何对象。

通常创建一个空的数组并设置为只能容纳一些对象。随着你添加更多的对象,内部数组需要被重新调整大小。这意味着需要分配更多的内存,然后将旧的对象移动到新的内存中,最后清理旧内存。

如果你知道数组将容纳 X 个对象,则使用 arrayWithCapacity 可以使数组更加高效。你仍然可以添加更多的对象,但是效率会降低。

总之,不能访问超出当前计数的数组索引。由于初始计数为0,因此无法访问任何对象。你需要在访问对象之前先添加对象。


哦,原来如此。我认为 arrayWithCapacity:10 会在数组上初始化10个nil指针。非常感谢你的帮助,伙计。 - Daniel Bastos

-3

你已经像这样初始化了数组:

NSMutableArray * myArray = [NSMutableArray arrayWithCapacity: 10];

这意味着您可以将最多10个对象添加到数组中。而您现在正在访问该数组的第六个对象:

id myVariable = myArray[5];

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

4
您实际上可以在超出容量的范围内添加物品。这只是一个提示,而不是限制。 - Chuck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接