2015-07-09 4 views
2

Кто-то хочет переопределить назначенный инициализатор UITableViewController- (instancetype)initWithStyle:(UITableViewStyle)style. Он добавил следующий код:Возможно ли переопределить назначенный инициализатор с помощью инициализатора удобства?

- (instancetype)initWithStyle:(UITableViewStyle)style { 
    self = [self init]; 

    return self; 
} 

и получает 2 предупреждения:

  1. Места инициализатор должен вызывать только назначенный инициализатору на «супер»
  2. Места инициализатор отсутствует «супер» вызова к назначенному инициализатор суперкласса

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

Спасибо!

+0

Что находится в методе 'init'? – trojanfoe

+0

@trojanfoe Это на самом деле называет [super initWithStyle: UITableViewStylePlain] ... Я знаю, что это плохо, и сказал ему не делать этого, но мне просто интересно, если это вообще возможно :) – Hampotato

+0

Ну, похоже, ОК, поскольку в конечном итоге он вызывает инициализатор суперкласса; так что это может быть просто подавление предупреждений компилятора. – trojanfoe

ответ

0

Это возможно, но есть несколько условий, которые необходимо выполнить, чтобы не получать предупреждения о компиляторе. ВСЕ назначенные инициализаторы для подкласса должны быть переопределены, также используйте макрос NS_DESIGNATED_INITIALIZER, чтобы отметить, что init .. методы должны рассматриваться как назначенные инициализаторы.

Ниже для подклассу UITableViewController -

.h

- (instancetype)initWithStyle:(UITableViewStyle)style;// this is no longer a designated initialiser 

- (instancetype)init NS_DESIGNATED_INITIALIZER; 

- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil NS_DESIGNATED_INITIALIZER; 

- (instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER; 

.m

- (instancetype)initWithStyle:(UITableViewStyle)style { 
//.. no longer treated as designated initialiser 
self = [self init]; 

return self; 
} 

- (instancetype)init { 
    if (self = [super initWithStyle:UITableViewStylePlain]) { 
     //.. this is now treated as designated initialiser 
    } 
    return self; 
} 

- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { 
     //.. must implement 
    } 
    return self; 
} 

- (instancetype)initWithCoder:(NSCoder *)aDecoder { 
    if (self = [super initWithCoder:aDecoder]) { 
     //.. must implement 
    } 
    return self; 
} 

Дополнительная информация содержится в Adopting Modern Objective-C под Объект Initializati на.

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