2012-04-15 45 views
1

在一本書裏,我看到代碼:在Objective-C中,如果調用addObjectAtIndex來構建數組,那麼是否需要調用initWithCapacity?

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

,讓我們說[masterWordList count]是15.然後將代碼構建陣列起來使用循環10次:

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

我不知道爲什麼words必須是initWithCapacity ...以及15個插槽?它不能是10或11(如果最後需要零...而且addObject不會自動增長數組大小嗎?我試過使用init而不是initWithCapacity並且代碼也能工作。在這本書中被簡化爲init

回答

4

initWithCapacity:只是簡單地給出類初始值設定項關於數組最終大小的「提示」。這樣,如果你知道你需要它,它可以提前分配足夠的空間。使用initWithCapacity:理論上可以提供更好的性能,因爲它可能意味着當您向其添加對象時,數組不必重新分配內存(我不知道它是否在當前實現中實際執行了此操作,但是可能的)。正如你所猜測的那樣,這只是一個暗示,並且使用initWithCapacity:完全是可選的。僅僅因爲你給了initWithCapacity:一定的大小並不意味着你的數組不能增長以容納更多的元素。此外,撥打init反而會工作得很好。

+1

正是如此。我建議你使用'-init',除非分析表明插入對象需要花費很多時間。(這不是純粹的理論 - 我不得不使用'-initWithCapacity:'出於速度的原因......一次。) – andyvn22 2012-04-15 21:07:44

3

我不知道爲什麼的話必須是initWithCapacity ...和15位?

事實上,initWithCapacity:generally not necessary at all,它may or may not預留空間我的理解是這是一個歷史性的附屬物

不能它是10或11(如果需要在端部具有nil ...)

這可能是10.提到on your other questionnil不是的部分陣列。它只是創建方法調用本身的一個哨兵值 - 它不是一個對象,也不會成爲集合的成員。

還有,會不會addObject:自動增長數組的大小?

是的,它會;您可以創建一個可變數組而不指定任何起始大小,並且它將根據需要增長。

那麼這本書中的代碼可以簡化到init嗎?

是的。

+0

感謝您的回答。我接受了安德魯的回答,提到它是一種提供提示的機制,以便因性能原因而不必每次動態增長大小。 – 2012-04-16 09:14:19

相關問題