2011-06-21 92 views
0

看來我應該實現三個初始化器。主要的初始化器是調用[super init]的初始化器,並且所有變量都在此方法中分配。但是由於其他兩個初始化器具有非重疊參數,它們都稱爲主初始化器。非重疊對象初始化

這種方法是否正確?在許多例子中,第三級初始化器調用第二級,然後第二級調用第一級,而第一級和第二級直接調用第一級初始化器。

-(id)initWithAccount:(NSString *)account_name apiKey:(NSString *)api_key lineid:(NSString *)line_id runTitle:(NSString *)run_title data:(NSString *)stringData runID:(NSString *)run_id{ 
if(self = [super init]){ 
    accountName = [account_name retain]; 
    runID = [run_id retain]; 
    apiKey = [api_key retain]; 
    lineID = [line_id retain]; 
    data = [stringData retain]; 
    runTitle = [run_title retain]; 
} 
return self; 
} 


-(id)initWithAccount:(NSString *)account_name apiKey:(NSString *)api_key runID:(NSString *)run_id{ 

return [self initWithAccount:account_name apiKey:api_key lineid:nil runTitle:nil data:nil runID:run_id]; 
} 

-(id)initWithAccount:(NSString *)account_name apiKey:(NSString *)api_key lineID:(NSString *)line_id{ 

return [self initWithAccount:account_name apiKey:api_key lineid:line_id runTitle:nil data:nil runID:nil]; 
} 

回答

2

在一定程度上它是一個品味的問題的初始化是否直接或通過在其他類調用初始化指定的初始化。重要的是,指定的初始化器在任何情況下都會被調用。

在你的例子中,你使用比較運算符(==)而不是分配它(=)來調用super。你需要改變這一點:

if(self == [super init]){ 

要麼這樣:

if((self = [super init])){ 

或本:

self = [super init]; 
if(self != nil){ 
0

一個主要的初始化是調用一個[超級初始化]和所有變量在此方法中分配。

我們通常會說「指定初始化者」,而不是「主要初始者」。

此方法是否正確?

是的,或多或少。你所有的初始化者最終都應該調用指定的初始化器,它應該首先調用超級類的指定的初始化器來初始化自己。

請注意,如果它沒有相同的選擇器,則應該覆蓋超類的指定初始器以調用指定的初始器。因此,在您的示例中,假設您直接從NSObject繼承,則需要覆蓋-init以使用適當的默認值調用-initWithAccount:apiKey:lineid:runTitle: