2012-10-24 40 views
3

我有一個採用一組被裝上使用類似下面的方法,從廈門國際銀行文件的需求定製的「控制」的應用程序:更快的方式從iOS中的包中加載Nib文件?

NSArray * topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"AudioPlayer" owner:self options:nil]; 
InteractiveMovieView *newAudio = [topLevelObjects objectAtIndex:0]; 

這種做法的偉大工程,除了有被加載一次多個控件,其中(實際上在應用的一個「頁面」上)。

每次從包中加載顯然效率很低,但我無法找到解決此問題的另一種方法。我試着加載筆尖成copy屬性一次,返回它的再使用需求,但不工作返回的副本是從來沒有的空白筆尖的一個「乾淨」的副本。

我希望這是有道理的,所有的幫助表示讚賞。

回答

5

這聽起來像你正在尋找UINib類。從文檔:

您的應用程序應該使用UINib對象時,它需要反覆實例相同的筆尖的數據。例如,如果你的表視圖使用榫文件實例表格視圖單元,緩存筆尖在UINib對象可以提供一個顯著的性能提升。

+0

你能解釋爲什麼[UINib nibWithNibName:捆綁:]可以提高性能?我認爲它只是創建一個指向Nib文件的UINib對象。沉重的工作是在[筆尖instantidateWithOwner:選項:]這確實取消存檔筆尖(在我看來,這種操作的更厲害) – onmyway133

+0

@entropy你的聲明相矛盾的文檔。 – nielsbot

+0

@nielsbot是的,它肯定是矛盾的,但你不覺得我是這樣嗎?人們說,這是昂貴的,這是昂貴的,......沒有理由:( – onmyway133

4

繼羅布的建議,你可以做到以下幾點:

@implmentation InteractiveMovieView (NibFactory) 

+(id)movieView 
{ 
    static UINib * __nib ; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     __nib = [ UINib nibWithNibName:@"AudioPlayer" bundle:nil ] ; 
    }); 

    InteractiveMovieView * view = [ __nib instantiateWithOwner:nil options:nil ][0] ; 
    return view ; 
} 

@end 
+3

幾乎所有的繁重通過'instantiateWithOwner發生在視圖的解除封存。創建一個靜態筆尖不會帶來任何性能提升。 – memmons

+0

@ MichaelG.Emmons你能指點一下嗎? – nielsbot

+0

如果我理解@Rob引用的文檔,應該緩存'UINib'對象,不是嗎? – nielsbot