有人想重写UITableViewController
指定的初始值设定项- (instancetype)initWithStyle:(UITableViewStyle)style
。他添加了以下代码:
- (instancetype)initWithStyle:(UITableViewStyle)style {
self = [self init];
return self;
}
并收到2条警告:
这样做可能是一个不好的做法。但是,是否可以在不发出警告的情况下使用便捷初始化程序覆盖指定的初始化程序?
谢谢!
这是可能的,但是必须满足几个条件才能获得编译器警告。子类的所有指定初始化程序都必须被覆盖,还必须使用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;
}
有关其他信息,请参见在对象初始化下的“采用现代Objective-C ”。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句