非重叠对象初始化

时间:2011-06-21 09:27:30

标签: iphone objective-c initialization

似乎我应该实现三个初始化器。主初始化程序是调用[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 个答案:

答案 0 :(得分:2)

在某种程度上,初始化程序是直接调用指定的初始值设定项还是通过类中的另一个初始化程序调用它是一种品味问题。重要的是,在任何情况下都会调用指定的初始值设定项。

在您的示例中,您使用比较运算符(==)调用super,而不是分配它(=)。你需要改变这个:

if(self == [super init]){

要么:

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

或者这个:

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

答案 1 :(得分:0)

  

主初始化程序是调用[super init]的程序,所有变量都在此方法中分配。

我们通常会说“指定的初始化”,而不是“主要的初始化”。

  

这种做法是否正确?

是的,或多或少。您的所有初始化程序最终都应该调用指定的初始化程序,该初始化程序应首先调用超类的指定初始化程序来初始化。

请注意,如果没有相同的选择器,您应该覆盖超类的指定初始化程序以调用指定的初始化程序。因此,在您的示例中,假设您直接从NSObject继承,则需要覆盖-init以使用适当的默认值调用-initWithAccount:apiKey:lineid:runTitle: