每个类都应该有一个指定的初始化器。子类化时,您通常会选择包含最多自定义参数的初始化程序,并将其称为“指定”。重要的部分是所有其他初始化程序(特别是包括为父类描述的默认初始化程序)都调用此初始化程序。只有“指定”初始化程序调用 super,所有其他初始化程序调用 self。
例如:
//The default initializer documented by Apple for a given class:
- (id)init
{
self = [super init];
return self;
}
因此,假设您有几个具有各种选项的初始化程序:
此自定义初始化具有最多的参数,并且是您的新“指定”。你会注意到它调用了[super init]:
- (id)initWithParamters:(NSObject *)paramterOne andParameter:(NSObject *)paramterTwo
{
self = [super init];
if (self)
{
__ivarOne = paramterOne;
__ivarTwo = parameterTwo;
}
return self;
}
你有一个额外的自定义初始化,但只接受一个参数。请注意,它调用 self (不是超级):
- (id)initWithParamter:(NSObject *)parameterOne
{
return [self initWithParamter:parameterOne andParameter:nil];
}
最后,覆盖类默认初始化程序(如文档中所述):
- (id)init
{
return [self initWithParamter:nil];
}
总结一下:您可以在子类中实现任意数量的自定义初始化程序。一个初始化器应该被认为是你的“指定”初始化器,并且只有这个方法应该实现[super init](其中init是超类的指定初始化器,它可能不是'init')。所有其他初始化程序都应该调用 [self init] (其中 init 是您的子类的指定初始化程序)。