2011-05-20 57 views
18

的Objective-C的NSArray初始化與initWithCapacity:0

[[NSMutableArray alloc] init]; 

[[NSMutableArray alloc] initWithCapacity:0]; 

編譯成同樣的事情?

如果它們不同,那麼在內存和運行時性能方面如何以及哪種形式「更好」?

+0

如果不知道實施細節,我希望能夠相信並說基金會團隊在兩者之間的表現差異可以忽略不計。從個人的觀點來看,我認爲最好的做法是,如果有意義的話,最好的做法是將類中提供的任何初始化方法都調用到通用方法上。由於NSMutableArray公開聲明瞭initWithCapacity並且只是繼承了init,我傾向於使用initWithCapacity。另外,爲什麼不寫一個循環,使用init和initWithCapacity分析許多可變數組創建並添加您的觀察值。 – Joe 2011-05-20 20:57:55

+3

另請參見[NSMutableArray initWithCapacity細微差別](http://stackoverflow.com/questions/3948062/nsmutablearray-initwithcapacity-nuances)。 – albertamg 2011-05-20 21:03:28

+0

請注意不成熟的優化。 – NSResponder 2011-05-20 21:18:24

回答

18

不,他們的行爲不一樣。 init將創建一個數組,其中包含一些未知的但非常可能的非零容量 - 無論作者認爲哪種大多數情況下都是合理的默認值。 initWithCapacity:0將請求一個絕對沒有分配空間的數組。這意味着達到NSMutableArray實現:它可能不允許容量爲0,並且行爲與init完全一致,或者它可能不會立即分配任何內容,而是在您分配一定數量(與init相同,或可能不相同)首先需要它。

哪個將完全執行「更好」取決於您期望如何使用陣列。 -init說:「我對這個數組沒有任何期望,我會加入或刪除它,或者它可能會很小。」 「我預計這個陣列在可預見的將來只有這麼多元素。」

關於我期望initWithCapacity:0是合理的唯一的地方是如果你正在創建一個陣列,你不希望在相當長的一段時間內填充任何東西。

請注意,標準性能警告適用於此:除非您進行配置並確定它是否可能不是問題。我無法真正想象出這種情況(除了成千上萬的對象),這兩者之間的差異將很大。

+5

+1請注意,使用'initWithCapacity:n'並不妨礙您向陣列添加多於* n *個對象。這只是一個建議,所以'NSArray'可以嘗試做一些優化。 – 2011-05-20 21:18:50

+1

另請參閱Matt Gallagher撰寫的[本博客文章](http://cocoawithlove.com/2008/08/nsarray-or-nsset-nsdictionary-or.html) – Scott 2011-05-23 16:30:35