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