你有点无所适从短语“指定初始化”的意思。一个班级可能有几个初始者。我们来看一个虚构的猫类。这可能有以下初始化:
- init
- initWithName:
- initWithName:breed:
- initWithName:breed:age:
指定初始化是实际执行的是类的初始化并通过对super
调用之一。最后一个,initWithName:breed:age
可能是指定的初始化程序,因为它获取的数据最多。它可能是这样实现的:
- (id)initWithName:(NSString *)name breed:(CatBreed)breed age:(NSUInteger)age {
if (self = [super init]) {
_name = [name copy];
_breed = breed;
_age = age;
}
return self;
}
这可以完成设置实例的所有工作。其他初始化程序将根据这个实现。例如,另外一个可能实现这样的:
- (id)initWithName:(NSString *)name {
return [self initWithName:name breed:CatBreedTabby age:0];
}
所以要改变一个子类的初始化行为,你只需要改变指定初始化,你会得到别人的自由。
有关更多详细信息,请参阅http://developer.apple.com/library/ios/#documentation/general/conceptual/CocoaEncyclopedia/Initialization/Initialization.html – 2013-04-10 22:39:11
中的“多个初始化程序和指定初始化程序”小澄清:' [super init]'是对*超类的*初始化程序的调用 - 它不是所讨论类的指定初始值设定项。 – Chuck 2013-04-10 22:52:52