在下面重载的初始化器中,可以调用[self initWith ..]吗?因为当[超级初始化]尚未发生时,我正在调用“自我”的东西?
当我测试这一切时,一切正常。这是否意味着即使在[super init]调用之前,也可以在'self'上调用方法?任何人都可以帮我理解这个吗?
-(id)initWithObjectA:(id)objectA{
if (self = [super init]) {
//Do other initializations
//Use ObjectA
}
return self;
}
-(id)initWithObjectA:(id)objectA andWithObjectB:(id)objectB{
if (self = [self initWithObjectA:objectA]) {
//Use ObjectB
}
return self;
}
//More overloading initializers
感谢。
答案 0 :(得分:2)
根据Apple's documentation,给定类的指定初始值设定项应该执行所有实际初始化;其他初始值设定项应直接或间接调用指定的初始化程序。所以你认为一个初始值设定项应该调用另一个初始化程序是正确的,但是你提供的示例是向后执行它。考虑重写方法如下:
- (id)initWithObjectA:(id)objectA
{
return [self initWithObjectA:objectA objectB:nil];
}
- (id)initWithObjectA:(id)objectA objectB:(id)objectB
{
if (self = [super init])
{
// Perform custom initialization...
}
return self;
}
修改强>
关于在对象完全初始化之前向self
发送消息,当然没关系。如果你考虑一下,self
是一个指针,它在一个对象收到一条消息时被初始化。 (self
实际上是作为隐藏参数传递给方法的,但那是另一个故事。)鉴于有问题的对象已经收到了一条消息,没有理由它不能发送自己的其他消息。
答案 1 :(得分:1)
是的,它运作正常。我经常这样做用默认值初始化私有变量。这有助于您编写更少的代码并显示构造函数层次结构。
self
此处的工作方式与编写super
的方式相同。所以它只是调用其他构造函数。
答案 2 :(得分:0)
它'不是一个好的,它总是最好的方式