2014-01-13 2 views
-1

Я создал другой метод init и хотел бы, чтобы это был назначенный инициализатор вместо стандартного -init. Как я могу запретить код клиента создавать экземпляр класса с помощью -init?Objective-C: Как предотвратить инициализацию нестандартного инициализатора?

например.

/* everyone must call this */ 
- (id)initWithInfo:(NSDictionary *)info { 
    self = [super init]; 
    if (self) { 
     _info = info; 
    } 

    return self; 
} 

/* Don't want anyone to be able to create this using init */ 
+2

sidenote: ваш метод отсутствует 'return self;' –

+0

и его «назначенный инициализатор», а не «инициализатор по умолчанию». – trojanfoe

+1

Либо сопоставьте 'init' с другим' init ...', либо запустите его. Невозможно «скрыть» его. –

ответ

5

init происходит от иерархии NSObject. У каждого класса будет init.

Следовательно вы не можете удалите метод суперкласса.

Также пользователь/разработчик может использовать любой другой способ создания нового объекта, такого как new, initWith....

0

Вы можете попробовать это:

- (id)init 
{ 
    return [self initWithInfo:@{}]; 
} 

- (id)initWithInfo:(NSDictionary *)info 
{ 
    self = [super init]; 
    if (self) 
    { 
     _info = [NSDictionary dictionaryWithDictionary:info]; 
    } 
    return self; 
} 
+3

Как вы передаете данные в someDictionary ??? До выделения класса? – Tirth

+0

Вся идея вопроса заключается в инициализации объекта пользовательским словарем, и вы устанавливаете его на 'nil'. – Desdenova

+0

Этот подход хорош, когда вам нужно выполнить некоторые пользовательские инициализации, но для инициализации информационного словаря нужно называть 'initWithInfo' методом. Нет ничего, что можно было бы отправить, вызвав метод init. –

0

В то время как вы не можете удалить суперкласса инициализаторами, вы можете «блокировать» их перекрывая их, как это:

- (id)init 
{ 
    NSAssert(NO, @"Use the designated initializer: -initWithInfo:"); 
    [self doesNotRecognizeSelector: _cmd]; 
    if (self = [super init]) 
    { 
     self = nil; 
    } 
    return self; 
} 

Это, по крайней мере, «глючить быстро »(во время выполнения.) Было бы неплохо, если бы это могло быть сделано для сбоя во время компиляции, но я не верю, что на этом этапе можно достичь этого.

+1

Зачем вообще вызывать '[super init]'? – trojanfoe

+0

Я думаю, вы, вероятно, не нуждаетесь *. – ipmcc

+0

И если это не удается, утверждение не срабатывает. Это не имеет никакого смысла. Это «слишком быстро». – trojanfoe

 Смежные вопросы

  • Нет связанных вопросов^_^