2013-02-11 14 views
6

我有一個視圖控制器,包含許多自定義UIViews。的UIView我嘗試使用的InterfaceBuilder(IB)內initWithFrame使用此代碼來定義它,並加載自定義:差異表現在:loadNibNamed與編程

NSArray *xib=[[NSBundle mainBundle] loadNibNamed:@"DayView" owner:self options:nil]; 

視圖控制器表現極爲緩慢,所以我決定嘗試加載自定義的UIView的項目編程。瞧,速度提高了約7

的因素怎麼來裝載XIB文件之間的差異用「乾淨」的代碼是如此之大?我可以想到的第一個假設是IB默認設置了很多屬性,而在代碼中定義它們時它們只是零。但它無法解釋巨大的性能差異!我還沒有發現任何明確警告您不要使用IB性能原因的帖子。

有什麼想法?

謝謝!

編輯: 我剛剛發現this link,因此this blogpost解釋了何時從光盤加載xi​​b文件有趣的事情。我想從光盤加載解釋不同。/K

+1

您可以檢查這個性能測試在這裏:http://www.cocoawithlove.com/2010/03/load-from-nib-or-construct-views-in.html。它有點舊,但我認爲仍然相關。也請閱讀結論,也許你會發現爲什麼它在你的情況下如此緩慢 – Mindaugas 2013-02-11 09:57:20

+0

我剛碰巧遇到這個問題今天。切換到以編程方式創建的UIView,我可以看到約5倍的速度。 Time Profile停止將其註冊爲瓶頸。 – user523234 2013-04-07 22:33:03

回答

5

這是某些時候,我得到了,也從我的經驗,谷歌發現。

=> I've done it both ways and here's my two sense: 

如果你的觀點是比較簡單的,並且你確信它不會有太大改變它;然後Xib走了。如果沒有,我編程建議所有的方式,因爲它至少有3個大好處:

1)你得到的一切是如何工作的場面,這大大有助於調試,如果有問題背後的更深層次的知識

2)完全控制和定製過的一切,所以如果有變化,很容易實現

3)減少混亂;這可能是個人喜好,但如果有大量的動作從按鈕被調用,這樣我覺得Interface Builder的箭頭曲折喧囂很多比編程更加混亂。

=>按步驟定義控件是比較費時的過程,然後使用XIB。因爲在飛行中創建所有的控件和位置等。

=>我也注意到,與加載視圖中的文件以編程方式使用大約一半的輔助存儲器爲廈門國際銀行文件。我不知道這轉化爲更大的應用程序,但它可能是在啤酒的應用考慮

=>我在做一些閱讀,我想我找到了那種密封處理贊成編程。原來,廈門國際銀行文件隱含使用imageNamed方法向自己的圖片加載到內存中,其中有一個衆所周知的緩存「功能」是內存問題。我還聽說IBOutlets是一個重要的內存管理問題。

所有這些接口建設者們非常非常好的工具,但如果你不知道你在做什麼,你不知道這些工具做你

1並不真正學到東西

2。可能會導致你的代碼的嚴重問題後

,一旦你瞭解一切是如何工作的完全正常使用這些小幫手......

在學習html,flex,swing和cocoa touch時,我經歷了同樣的過程......開始時它可能需要更長的時間,但是一旦你理解了它並且可以編寫幫助程序類/方法,那麼這些工作將會非常快速和良好爲你。

Just found some usefull information/tips about xib: 

保持你的筆尖文件小 在Xcode配備一個或兩個預配置的筆尖文件大多數新項目。許多新開發界面生成器的開發人員犯的一個錯誤是將其應用程序的所有窗口和菜單放在這一個或兩個nib文件中。錯誤的原因通常是方便的。 (模板項目通常會自動加載預配置的nib文件,這使開發人員無需添加更多的nib加載代碼。)不幸的是,依賴這種便利性通常會導致性能降低並增加應用程序的內存壓力。

當一個nib文件被加載到內存中時,這是一個無所事事的努力。 nib加載代碼無法知道文件中有多少對象或哪些對象很重要,因此整個文件必須加載到內存中。從這些內存數據中,單個對象被實例化。對於Cocoa和iPhone應用程序,nib文件中的所有對象都會立即實例化,以便重新建立出口和動作連接。如果您的應用程序最初僅使用一些nib文件對象,則將所有對象放在內存中都是浪費。

對於所有項目,最好設計每個筆尖文件,以便它僅包含在給定情況下立即需要的那些對象。當加載到內存中時,這樣的nib文件儘可能使用盡可能少的內存,同時仍然擁有完成任務所需的所有內容。以下是組織筆尖文件時需要考慮的一些設計選項:

對於您的應用程序的主筆尖文件,只包括您的菜單欄(或者在iPhone應用程序的情況下,只是主窗口)。

對於Mac OS X中的文檔筆尖文件,只包括文檔窗口和顯示該窗口所需的對象(如控制器)。

對於其他筆尖文件,請將筆尖文件放在關鍵物體上,例如您打算顯示的單個窗口或面板。然後,nib文件中的所有其他對象都應該便於該窗口或面板的即時操作。

對於更改其嵌入式視圖層次結構的窗口,如果層次結構不經常更改,請考慮將任何其他層次結構存儲在單獨的nib文件中。僅在使用時加載每個視圖層次結構。

如果您已經有大的nib文件,可以使用Interface Builder的重構工具將它們分成幾個較小的nib文件。有關如何使用Interface Builder的重構工具的信息,請參閱「重構您的Nib文件」。有關如何從代碼中顯式加載nib文件的信息,請參見「資源編程指南」。

但我個人認爲作爲一個專業的程序員(如我是一個軟件開發者)是它的總是最好的初學者開始與的程序化的方式只是爲了學習和了解如何一切正常

+2

也許你可以專注於性能的含義,這就像一個一般的反界面構建器博客文章,我沒有看到太多的性能影響。 – 2013-02-11 10:02:38

+0

@CarlVeazey。這是性能(也是速度)的基本點。先讀它然後放棄...投票。 – iPatel 2013-02-11 10:05:32

+0

@iPatel。感謝您的發佈。有點漫長而雜亂,但是你陳述了一些我可能會深入研究的有趣點。 – kjoelbro 2013-02-11 12:19:19