首页 > iOS中指定初始化方法的问题。

iOS中指定初始化方法的问题。

哈罗大家好!

下面是我为一个类写的两个初始化方法,上方的是这个类的指定初始化方法,下方的是父类的指定初始化方法,问题是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)styleUITableViewController的指定构造器。(假如你继承的类是UITableViewController的话)它的参数列表跟父类的指定构造器一样,所以编译器认为它也是一个指定构造器,就会报warning。不信你可以试试,把initWithStyle随便改改成initWithSssstyle,马上就不报错了。

能不能用便利构造器覆盖指定构造器

这里虽然会报warning,但是实际上能不能这么做呢?文档里没查到不能这么做…… 我刚在stackoverflow上问了一下,有人说,问题不大,可以把warning suppress掉……

应不应该用便利构造器覆盖指定构造器

我想不出什么场景需要这么做。就你所贴代码的情况,尤其不应该如此。你难道没发现,在你重写之后style这个参数完全丢掉了吗?正确的做法显然是在- (instancetype)initWithStyle:(UITableViewStyle)style 里面调superinitWithStyle。可以理解为init方法是一个大家族,initWithStyle:方法是另一个大家族,现在你想让中间出一个叛徒…… 调用方却不会知道这一点,可能带来很多的麻烦。

应不应该继承UITableViewController

继承一个类的时候要非常慎重,而从你贴的代码里我看不出有继承UITableViewController的必要。如果要做数据初始化,应该是写在viewDidLoad等钩子函数里,而不是构造函数里。


死循环了啊,初始化当然有问题了

【热门文章】
【热门文章】