哈罗大家好!
下面是我为一个类写的两个初始化方法,上方的是这个类的指定初始化方法,下方的是父类的指定初始化方法,问题是Xcode会针对下面的方法发出警告,警告内容看这里http://7xjqtx.com1.z0.glb.clouddn.com/init_Screen%20Shot%202015-07-09%20at%2018.25.27.png
,貌似编译器认定下面的才是这个类的指定初始化方法,
- (instancetype)init
{
self = [super initWithStyle:UITableViewStylePlain];
if (self) {
for (int i = 0; i < 5; i++) {
[[RAPItemBarn shareBarn] createItem];
}
}
return self;
}
- (instancetype)initWithStyle:(UITableViewStyle)style
{
self = [self init];
return self;
}
吓我一跳,看半天以为是Swift,没想到是OC……
先说会报错的原因
我理解你的意思是,第二个方法你想要让它是一个便利构造器,不明白为什么编译器把它当做指定构造器。
但
- (instancetype)initWithStyle:(UITableViewStyle)style
是UITableViewController
的指定构造器。(假如你继承的类是UITableViewController
的话)它的参数列表跟父类的指定构造器一样,所以编译器认为它也是一个指定构造器,就会报warning。不信你可以试试,把initWithStyle
随便改改成initWithSssstyle
,马上就不报错了。能不能用便利构造器覆盖指定构造器
这里虽然会报warning,但是实际上能不能这么做呢?文档里没查到不能这么做…… 我刚在stackoverflow上问了一下,有人说,问题不大,可以把warning suppress掉……
应不应该用便利构造器覆盖指定构造器
我想不出什么场景需要这么做。就你所贴代码的情况,尤其不应该如此。你难道没发现,在你重写之后
style
这个参数完全丢掉了吗?正确的做法显然是在- (instancetype)initWithStyle:(UITableViewStyle)style
里面调super
的initWithStyle
。可以理解为init
方法是一个大家族,initWithStyle:
方法是另一个大家族,现在你想让中间出一个叛徒…… 调用方却不会知道这一点,可能带来很多的麻烦。应不应该继承
UITableViewController
继承一个类的时候要非常慎重,而从你贴的代码里我看不出有继承
UITableViewController
的必要。如果要做数据初始化,应该是写在viewDidLoad
等钩子函数里,而不是构造函数里。