2009-10-05 28 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