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

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

{
    // call to the superclass designated initializer
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization (自定义的初始化过程)
    }
    return self;
}

@end


这个例子中,ZOCViewController继承自UIViewController,这里我们有一些其他的需求(比如希望在初始化的时候给一些成员变量赋值),所以需要重写父类的指定初始化方法initWithNibName:bundle:方法。

 

注意,如果在这里并没有重载这个方法,而是重载了父类的init方法,那么会是一个错误。

因为在创建这个类(ZOCViewController)的时候,会调用initWithNib:bundle:这个方法,所以我们重载这个方法,首先保证父类初始化成功,然后在这个方法中进行额外的初始化操作。但是如果重载init方法,在创建这个类的时候,并不会调用init方法(调用的是initWithNib:bundle:这个指定初始化方法)。

第三种方式是希望提供自己的类初始化方法,应该遵守下面三个步骤来保证正确性:

定义你的 designated initializer,确保调用了直接超类的 designated initializer。
重载直接超类的 designated initializer。调用你的新的 designated initializer。
为新的 designated initializer 写文档。
很多开发者会忽略后两步,这不仅仅是一个粗心的问题,而且这样违反了框架的规则,而且可能导致不确定的行为和bug。

正确的例子:

复制代码
@implementation ZOCNewsViewController

 

- (id)initWithNews:(ZOCNews *)news
{
    // call to the immediate superclass's designated initializer (调用直接超类的 designated initializer)
    self = [super initWithNibName:nil bundle:nil];