2009-10-05 84 views
2

除了返回自动释放对象和另一个需要手动释放的对象之外,是否有任何理由使用这些对象之一?NSMutableArray,alloc或capacity?

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

OR

NSMutableDictionary *drink = [NSMutableDictionary dictionaryWithCapacity:10]; 

加里

+1

我从来没有用方便的方法(自动释放),除非我有一个习惯,因为在iPhone上,他们建议使用手动释放对象,而不是。即使在OS X上,自动发布的对象仍然需要更多的工作(对于NSAutoreleasePool,不是你),然后手动的。 – mk12 2009-10-05 12:20:11

+0

请注意,这些都不返回管理对象。 “可管理”在Cocoa中有着与Core Data相关的不同含义,因此,当您的意思是“应用autorelease的对象”时,不应使用它。“增加额外的autorelease并不意味着你可能不需要手动发布它;如果你稍后保留它,你需要将它与一个发布版本匹配起来。这里没有自动管理。 – 2009-10-05 12:26:01

+0

谢谢,我会更新 – fuzzygoat 2009-10-05 12:54:16

回答

6

这些方便的方法是减少的,你必须编写的代码量是有用的,在那里在某些情况下帮助。

除了+ dictionaryWithCapacity:和+ dictionary方法将被自动释放以外,你得到的对象将没有真正的区别,而且由-init返回的对象不会。另外,如果你知道有多少项目会被放入字典中,+ dictionaryWithCapacity:和-initWithCapacity:将提高效率,因为字典将能够正确地分配适量的内存球棒。

+0

如果你看看CFMutableArrayRef的文档(这是CFMutableArray的免费桥接),你会看到使用给定容量进行初始化的情况下,您可以返回除传递给init方法之外的实例,这是可以理解的,因为大容量数组使用不同的私有su bclass能够更好地处理大量值。基本上,你提供了你打算存储在数组中的多少值的提示。你可以超过这个数字,它会适应,所以进入大球场将有助于防止浪费的空间。 – 2009-10-05 14:46:59

+1

使用非零容量创建的CoreFoundation可变集合从Mac OS X 10.0到10.4的容量得到修复。 Leopard消除了固定可变集合类型,以支持仅在指定容量为0时才使用的可变大小集合类型。苹果公司的“CoreFoundation集合编程主题”尚未更新以反映这一点;您只能在10.5的CoreFoundation框架发行说明中找到这个小技巧。 – 2009-10-06 05:35:41

1

第一个将使用默认大小初始化NSMutableArray。所以在内部,NSMutableArray会根据需要重新分配空间,当你添加新的键值时。事实上,你必须自己释放它,init不会调用autorelease。

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

作为一个惯例,所有以init开始的方法都必须用你的代码显式地分配和释放,而静态方法如dictionary *是自动释放的。

0

我可以考虑选择一种方法的唯一原因是性能原因......只有在极端情况下。

示例情况下,添加一百万对象的NSMutableArray

与[[NSMutableArray里的alloc] INIT],它得realloc的一百万次,每次添加的对象的时间。

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

因此,如果您知道要预先放入阵列中的项目数量,请选择初始容量。

如果你没有,那么去默认的alloc + init。

这里有一个很好的文章,可能会给更多的了解: http://cocoawithlove.com/2008/08/nsarray-or-nsset-nsdictionary-or.html

+0

“......它必须重新分配一百万次......”不一定。如果他们聪明(他们通常是),它会每次为一些额外的对象分配空间,特别是不需要重新分配一百万次。不过,我的确同意你的结论:如果你知道该数组将持有X倍Y对象,让NSArray知道这个数字。 – 2009-10-05 22:24:43