2015-06-06 45 views
0

起初,對不起我的英語。我試圖用幾個輸入點(像initWithFrame:和initWithCoder :)這樣的幾個初始化器來解決問題。不要重複我的設置代碼。起初我有一個簡單的解決方案,只是創建由初始化程序調用的方法(例如「setup」)。但是,子類有一個小問題。如果我的子類擁有像initWithFrame:backgroundColor:和屬性「backgroundColor」的自己的初始化器,那麼它自己的overriden「setup」將被超級初始化器調用,但「backgroundColor」將仍然爲零。所以這個「設置」將不能使用這個屬性。我認爲它的共同問題,它有很好的共同解決方案,我找不到。謝謝。IOS中的幾個輸入點

+1

你能發佈一些相關的代碼嗎? – Bannings

+1

我建議你閱讀關於初始化器的Swift文檔。它描述了初始化程序的所有各種問題,以及該語言如何解決問題或使其代碼更具防禦性。所有的模式都適用於Objective-C。 – bbum

回答

2

通常,我將創建一個名爲_commonInit(MyClass *self)的靜態函數,並從每個初始值設定項中調用該函數。這是一個功能,因爲它不會被繼承。

+0

謝謝,它很酷,但你能解釋爲什麼這個func不能被繼承嗎? – Ar4ibald

+0

如果需要,它可以作爲方法繼承。但是這證明存在問題,因爲您現在有第二個初始化鏈和附加的順序依賴關係。 – bbum

0

基類

-(instancetype)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) 
    { 
     [self setup]; 
    } 
    return self; 
} 

-(instancetype)initWithCoder:(NSCoder*)aDecoder 
{ 
    self = [super initWithCoder:aDecoder]; 
    if (self) 
    { 
     [self setup]; 
    } 
    return self; 
} 

-(void)setup 
{ 
    //some setup code 
} 

子類

-(instancetype)initWithFrame:(CGRect)frame param:(id)param 
{ 
    self = [super initWithFrame:frame]; 
    if(self) 
    { 
     self.param = param; 
     //setup will be run by parent 
    } 
    return self; 
} 

-(void)setup 
{ 
    [super setup]; 
    //child setup code 
    //when this code will work self.param will still nil! 
} 

這就是我的意思