我已经查看了有关init和初始化程序概念的书籍和多篇论坛帖子,但我仍然无法理解指定的初始化程序。
它的代码是什么样的?
在下面的代码中,哪个代码行是指定的初始化程序?
-( Fraction *) initWith (int) n over: (int) d
{
self = [ super init];
if (self)
[self setTo: n over: d ];
return self;
}
谢谢。
答案 0 :(得分:4)
你对“指定初始值设定项”的含义有点困惑。一堂课可能有几个初学者。我们来看一个虚构的Cat课程。它可能有以下初始值设定项:
- 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];
}
因此,要在子类中更改类的初始化行为,只需更改指定的初始化程序,即可免费获取其他初始化程序。
答案 1 :(得分:2)
每个初始化程序必须在其实现中调用指定的初始化程序。
在这种情况下,[super init]
调用是对类的超类初始化程序的调用,因此这可能是设计的初始化程序本身。
指定的初始值设定项可以不止一个,具体取决于具体的类。为了找到那些,你需要查看文档。
例如UIView
有两个指定的初始值设定项
-initWithFrame:
-initWithCoder:
并且您必须在自定义UIView
子类中的任何其他初始化程序中调用其中一个。
有关详细信息,请参阅Multiple Initializers and the Designated Initializer(感谢Seamus)