NSMutableArray,alloc还是capacity?

时间:2009-10-05 12:09:21

标签: objective-c cocoa

除了一个返回自动释放的对象而另一个需要手动释放之外,有没有理由选择其中任何一个?

NSMutableDictionary *drink = [[NSMutableDictionary alloc] init];
// do things ...
[drink release];

OR

NSMutableDictionary *drink = [NSMutableDictionary dictionaryWithCapacity:10];

加里

3 个答案:

答案 0 :(得分:6)

这些便利方法可用于减少您必须编写的代码量,并且在某些情况下可以提供帮助。

除了+ dictionaryWithCapacity:和+字典方法将自动释放之外,你得到的对象没有真正的差别,-init返回的方法不会。

顺便说一句,如果您知道将在字典中放入多少项,+ dictionaryWithCapacity:和-initWithCapacity:将提供效率的轻微提升,因为字典将能够分配正确的内存量蝙蝠。

答案 1 :(得分:1)

第一个将使用默认大小初始化NSMutableArray。因此,当您向其添加新的key:value时,NSMutableArray内部将根据需要重新分配空间。实际上,你必须自己释放它,init不会调用自动释放。

第二个将在您的对象中预先分配10个插槽。如果您事先知道词典中有多少项目,那么在这方面会更好。此方法将自动释放。您也可以调用initWithCapacity,它不会像init那样自动释放,但具有预先分配的大小。

作为惯例,所有以init开头的方法必须由代码明确地分配和释放,并且像字典*这样的静态方法是自动释放的。

答案 2 :(得分:0)

我能想到选择一种方法而不是另一种方法的唯一原因是出于性能原因...而且只是在极端情况下。

示例案例,向NSMutableArray添加了一百万个对象

使用[[NSMutableArray alloc] init],每次添加一个对象时,它都必须重新分配一百万次。

[[NSMutableArray alloc] initWithCapacity:1000000],数组将在一开始就为一百万个对象分配足够的内存,因此不会产生第一种方法带来的额外开销。

因此,如果您事先知道要将多少项目放入阵列,请寻找初始容量。

如果不这样做,则转到默认的alloc + init。

这是一篇很好的文章,可以提供更多见解: http://cocoawithlove.com/2008/08/nsarray-or-nsset-nsdictionary-or.html