2012-01-30 49 views
20

想知道更多關於initinitWithNibName之間的實際差異。 SO回答如this表明最好通過「init」間接呼叫「initWithNibName」。UIViewController(init和initWithNibName)

  1. 是否有任何情況需要定義「init」和 「initWithNibName」的區別?
  2. 在單個程序執行期間是否有可能需要將多個Nib文件加載多次 ?
  3. 是問題1 & 2相互關聯?

回答

30

這不是更好通過初始化間接調用initWithNibName: 。您只想在某個時間致電initWithNibName:。你可以在外部或內部完成。有些人認爲在內部做更好。實際上我有一個名爲「LayoutUtil」的類,我保留了與佈局相關的幫助器方法,以避免一遍又一遍地寫出繁瑣的與佈局相關的代碼。這裏是我的代碼加載一個UIViewController:

+ (id)loadController:(Class)classType { 
    NSString *className = NSStringFromClass(classType); 
    UIViewController *controller = [[classType alloc] initWithNibName:className bundle:nil]; 
    return controller; 
} 

然後,我可以這樣做:

MyViewController *c = [LayoutUtil loadController:[MyViewController class]]; 

如果你願意,你可以添加一個名爲方法ughhhh一類,並調用它在那裏,根本不重要。重點是,儘管在init方法中調用initWithNibName並不是一個更好的做法,但您只是想確保在啓動UIViewController時調用它。

- (id)ughhhh 
{ 
    self = [super initWithNibName:@"Myview" bundle:nil]; 
    if (self != nil) 
    { 
    } 
    return self; 
} 

一個nib文件可以肯定需要加載多次。每次在UIViewController上調用initWithNibName時,都必須加載xib。很多人加載不由一個UIViewController這樣擁有UIViews:

[[NSBundle mainBundle] loadNibNamed:@"nameOfXIBFile" owner:self options:nil]; 

每次調用此函數時,你會被加載筆尖。

在某些情況下可以緩存筆尖。一個例子是UITableView--但是表視圖實現了它自己的緩存。操作系統不會自動執行任何緩存。

initinitWithNibName:是相關的,因爲initWithNibName:自動調用對象的初始化。

+1

+1,非常好詳細... – doNotCheckMyBlog 2012-01-30 05:20:51

+0

感謝您詳細的解答,並熱心幫助...... – Stanley 2012-01-30 05:36:40

+1

剛一說明:分配給自己,你需要有一個以'init'開始的方法。所以' - (id)initUghhhh' – benaneesh 2015-02-05 20:05:21

2

回答的第一個問題

理想的情況下每一個initWithNibName電話init內部,所以你並不需要在正常的情況來限定,但是你可以,如果查看從loadView在一種情況下與弗朗筆尖還加載以及來自不同視圖的另一種情況。

回答的第二個問題

每次查看在堆棧筆尖推加載

第三個問題的

回答

沒有

+0

謝謝您的回答和實物援助... – Stanley 2012-01-30 05:28:08

10

通過「init」'間接調用「initWithNibName」不是更好。您應該使用更適合您的需求的任何一種。說[[UIViewController alloc] init]就像是說[[UIViewController alloc] initWithNibName:nil bundle:nil],所以如果這些是你想通過的論據,你不妨使用[[UIViewController alloc] init]

在回答你的問題:

  1. 您可以定義initinitWithNibName:bundle:不同,如果你想。你可以定義其中的一個。例如,UIImagePickerController只定義了init,如果您嘗試發送它initWithNibName:bundle:,它將無法正常工作。或者你可以定義一些完全不同的init...方法。例如,UINavigationController只定義initWithRootViewController:。無論你做什麼init方法定義,最終都必須調用它的父類的init方法之一。

  2. 是的,一個筆尖可以加載多次。如果您創建相同視圖控制器子類的多個實例,則可能會多次加載相同的筆尖。實際上,視圖控制器的一個實例可以多次加載它的筆尖。怎麼樣?如果視圖控制器的視圖當前不在屏幕上,並且系統內存不足,系統將要求視圖控制器釋放其視圖。如果視圖控制器稍後需要將其視圖放回到屏幕上,它將再次加載該筆尖。

  3. 問題1和2是不相關的。

+0

感謝您的詳細解答和善意的幫助...... – Stanley 2012-01-30 06:01:01

相關問題