{
// 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];










