1

在书中,我看到了代码:

words = [[NSMutableArray alloc] initWithCapacity:[masterWordList count]];

假设[masterWordList count]是 15。然后代码通过使用循环 10 次来构建数组:

[words addObject:[masterWordList objectAtIndex:randomNum]];

我想知道为什么words必须initWithCapacity...和 ​​15 个插槽?不能是 10 还是 11 (如果最后需要一个 nil ......而且,不会addObject自动增加数组大小?我尝试使用init而不是initWithCapacity代码也可以工作。书中的代码也可以简化为just init?

4

2 回答 2

4

initWithCapacity:简单地给类初始化器一个关于数组最终大小的“提示”。这样,如果您知道您将需要它,它可以提前分配足够的空间。从理论上讲,使用initWithCapacity:可以提供更好的性能,因为它可能意味着当您向其添加对象时,数组不必重新分配内存(内部)(我不知道它在当前实现中是否真的这样做,但这是可能的) . 正如您已经猜到的那样,这只是一个提示,使用initWithCapacity:完全是可选的。仅仅因为你已经给出initWithCapacity:了一定的大小并不意味着你的数组不能增长到容纳更多的元素。此外,改为调用init会正常工作。

于 2012-04-15T21:00:44.657 回答
3

我想知道为什么单词必须是 initWithCapacity... 和 15 个插槽?

事实上,initWithCapacity:一般完全没有必要。它可能会或可能不会以有用的方式保留空间。我的理解是,它是一种历史性的附属物。

不能是 10 还是 11(如果nil最后需要 a...)

可能是 10。正如您在另一个问题中提到的,nil 它不是数组的一部分。它只是创建方法调用本身的一个标记值——它不是一个对象,也不会成为集合的成员。

另外,不会addObject:自动增加数组大小吗?

是的,它会的; 您可以在不指定任何起始大小的情况下创建一个可变数组,它会根据需要增长。

那么书中的代码可以简化为init吗?

是的。

于 2012-04-15T21:00:27.747 回答