Не перекрывающаяся инициализация объекта - PullRequest
0 голосов
/ 21 июня 2011

Кажется, я должен реализовать три инициализатора. Основной инициализатор - это тот, который вызывает [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 ]

2 голосов
/ 21 июня 2011

В некоторой степени это зависит от вкуса, вызывает ли инициализатор указанный инициализатор напрямую или через другой инициализатор класса.Важно то, что назначенный инициализатор вызывается в любом случае.

В вашем примере вы вызываете super с оператором сравнения (==) вместо назначения его (=).Вам нужно изменить это:

if(self == [super init]){

на следующее:

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

или на это:

self = [super init];
if(self != nil){
0 голосов
/ 21 июня 2011

Основной инициализатор - это тот, который вызывает [super init], и все переменные назначаются в этом методе.

Вместо "основного инициализатора" мы обычно говорим "назначенный инициализатор"".

Является ли этот подход правильным?

Да, более или менее.Все ваши инициализаторы должны в конечном итоге вызвать назначенный инициализатор, который должен инициализировать себя, сначала вызвав назначенный инициализатор суперкласса.

Обратите внимание, что вы должны переопределить инициализатор назначенного суперкласса, чтобы вызвать назначенный инициализатор, если у него неттот же селектор.Так что в вашем примере, предполагая, что вы наследуете непосредственно от NSObject, вам нужно переопределить -init для вызова -initWithAccount:apiKey:lineid:runTitle: с соответствующими значениями по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...