Objective-C中编程中一些推荐的书写规范小结

2020-01-14 22:32:41刘景俊

    if (self) {
        _news = news;
    }
    return self;
}

// Override the immediate superclass's designated initializer (重载直接父类的  designated initializer)
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    // call the new designated initializer
    return [self initWithNews:nil];
}

@end


​很多开发者只会写第一个自定义的初始化方法,而不重载父类的指定初始化方法。

 

在第一个自定义的初始化方法中,因为我们要定义自己的指定初始化方法,所以在最开始的时候首先要调用父类的指定初始化方法以保证父类都初始化成功,这样ZOCNewsViewController才是可用状态。(因为父类是通过initWithNibName:bundle:这个指定初始化方法创建的,所以我们要调用父类的这个方法来保证父类初始化成功)。然后在后面给_news赋值。

​如果仅仅是这样做是存在问题的。调用者如果调用initWithNibName:bundle:来初始化这个类也是完全合法的,如果是这种情况,那么initWithNews:这个方法永远不会被调用,所以_news = news也不会被执行,这样导致了不正确的初始化流程。

解决方法就是需要重载父类的指定初始化方法,在这个方法中返回新的指定初始化方法(如例子中做的那样),这样无论是调用哪个方法都可以成功初始化。

间接初始化方法是一种提供默认值、行为到初始化方法的方法。

你不应该在间接初始化方法中有初始化实例变量的操作,并且你应该一直假设这个方法不会得到调用。我们保证的是唯一被调用的方法是 designated initializer。

这意味着你的 secondary initializer 总是应该调用 Designated initializer 或者你自定义(上面的第三种情况:自定义Designated initializer)的 self的 designated initializer。有时候,因为错误,可能打成了 super,这样会导致不符合上面提及的初始化顺序。