Это возможно, но есть несколько условий, которые необходимо выполнить, чтобы не получать предупреждения о компиляторе. ВСЕ назначенные инициализаторы для подкласса должны быть переопределены, также используйте макрос 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 на.
Что находится в методе 'init'? – trojanfoe
@trojanfoe Это на самом деле называет [super initWithStyle: UITableViewStylePlain] ... Я знаю, что это плохо, и сказал ему не делать этого, но мне просто интересно, если это вообще возможно :) – Hampotato
Ну, похоже, ОК, поскольку в конечном итоге он вызывает инициализатор суперкласса; так что это может быть просто подавление предупреждений компилятора. – trojanfoe