1

在下面的重载初始化程序中可以调用 [self initWith..] 吗?因为当 [super init] 还没有发生时,我正在调用“self”上的东西?

当我测试这一切都很好。这是否意味着甚至可以在 [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

谢谢。

4

3 回答 3

2

根据Apple 的文档,给定类的指定初始化程序应该执行所有实际初始化;其他初始化程序应直接或间接调用指定的初始化程序。因此,您认为一个初始化程序应该调用另一个初始化程序是正确的,但是您提供的示例是向后执行的。考虑重写方法如下:

- (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实际上是作为隐藏参数传递到方法中的,但那是另一回事了。)鉴于有问题的对象已经收到了一条消息,它没有理由不能向自己发送额外的消息。

于 2013-02-10T05:51:00.667 回答
1

是的,它工作正常。我经常这样做是为了用默认值初始化私有变量。这有助于您编写更少的代码并显示构造函数层次结构。

self这里的工作方式与您编写的方式相同super。所以它只是调用其他构造函数。

于 2013-02-10T05:30:54.153 回答
0

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

这不是一个好方法,它总是最好的方法

于 2013-02-10T05:35:03.267 回答