2011-08-11 25 views
6

我見過一些示例代碼讓我想知道如何在超類中調用指定的初始化程序。說我有一些代碼如下:子類應該調用直接超類中的指定初始化程序嗎?

@interface NewTableViewCell : UITableViewCell { 
} 
@end 

@implementation NewTableViewCell 
- (id) initWithFrame: (CGRect)frame { 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Do some stuff 
    } 
return self; 
} 
@end 

注意initWithFrameUIView,不UITableView指定的初始化。該代碼是否應該始終調用[UITableViewCell initWithStyle:reuseIdentifier:],還是取決於編碼器的意圖?

+0

你的意思[UITableViewCell的initWithStyle:reuseIdentifier:] – Joe

回答

7

當進行子類化時,指導原則是指定的初始化程序必須調用其超類的指定初始化程序。

另一個指導原則是子類需要重載超類的指定初始化器來調用新的指定初始化器。

如果UITableViewCell遵循這一指導方針(和它;我與類別的幫助下測試),它覆蓋了超類的指定初始化(UIViewinitWithFrame:)調用新的指定初始化(initWithStyle:reuseIdentifier:)。因此,如果您致電它將呼叫initWithStyle:reuseIdentifier:,而這又將initWithFrame:superUIView)。

因此,它將需要一個額外的方法調用,但它最終將通過initWithStyle:reuseIdentifier:

同樣,最好的做法是指定初始值設定項必須調用超類的指定初始值設定項,並且不是指定初始值設定項的其他初始值設定項必須調用指定的初始值設定項。從"The Designated Initializer"

一般原則:一個類中的指定初始化必須通過消息超,調用父類中的指定初始化。

指定的初始值設定項通過消息鏈接到super,而其他初始化方法通過消息鏈接到指定的初始值設定項。

+0

如果指定的初始化符調用父類的指定初始化,什麼是應該做的其他初始化?假設我決定我的視圖的指定初始化器是一個名爲initWithPoint:(CGPoint)的方法。 initWithFrame的實現是什麼?它會用默認的Point調用指定的初始化程序嗎?它會做別的嗎? – csano

+0

@ j0k其他初始化器應該調用指定的初始化器。你不是被迫提供'initWithFrame'方法,但是如果你這樣做,我想你可以用默認點調用你的指定初始化器。如果你沒有提供方法,並且你通過'initWithFrame'(在超類中定義)初始化一個新實例,那麼你指定的初始化器最終會被調用並且實例將被正確初始化。 – albertamg

+0

感謝您的回答。除了在文檔中提到這個之外,我們需要做什麼來指定初始化器作爲指定初始化器嗎? – csano

1

我同意它取決於編碼員的嘗試,但編碼器應該總是嘗試使用指定的初始值設定項。考慮一下你可能寫過的初始化函數,他們可能會做一些額外的工作,讓你的對象處於可用或想要的狀態。如果你重寫了一個初始化器,就像你在你的例子中做的那樣,你也應該調用重寫的初始化器。如果這是一個自定義的init方法,那麼你會想調用指定的初始值設定項,因爲對於UITableViewCell來說,這是公開設置reuseIdentifier的唯一方法。

//Override initWithFrame 
//Fine although it may not (should not) get called for a UITableViewCell 
- (id) initWithFrame: (CGRect)frame { 
    self = [super initWithFrame:frame]; 

//Design a custom initializer to gather parameters for supers default initializer 
-(id)initWithCustomObject:(id)object style:(UI..Style)style reuseIdentifier:(NSString*)rid { 
    //This should call initWithStyle:reuseIdentifier: 
相關問題