可以调用自我重载的初始化程序吗?

时间:2013-02-10 05:23:11

标签: objective-c

在下面重载的初始化器中,可以调用[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

感谢。

3 个答案:

答案 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)

是的,你可以这样做。这就像从其他方法调用的简单方法。这里没什么不好的根据您的对象数量,您可以调用您的特定初始化程序。

它'不是一个好的,它总是最好的方式