在objective-c中,if(self){[self initFOO]}是多余的?

时间:2012-03-23 00:38:21

标签: objective-c

我正在从Paul Hegarty的Stanford CS193P学习。然后我看到这样的东西,我也看到其他人使用:

- (id)init
{
    self = [super init];
    if (self) {
        [self someSetupFunctions];
    }
    return self;
}

这不是多余的吗?为什么不直接使用:

- (id)init
{
    self = [super init];
    [self someSetupFunctions];
    return self;
}

我认为这些消息只是失败,所以为什么不使用第二种格式呢?

3 个答案:

答案 0 :(得分:5)

除了将消息传递给自己之外,您可能还想做其他事情。例如:

- (id)init
{
    self = [super init];
    if (self) {
        // set up ivars
        _anIvar = 5;
    }
    return self;
}

答案 1 :(得分:4)

[self someSetupFunctions]的真正含义是一些初始化代码,而不仅仅是单个方法调用,如果self为零,许多重要的事情都会失败。最值得注意的是,尝试将初始值分配给实例变量将会崩溃。

答案 2 :(得分:0)

self = [super init]; if (self)测试是因为如果无法创建满足初始化程序所需条件的对象,则某些初始化程序将返回不同的对象,包括nil

在你自己的初始化程序中,你需要防御超类这样做,因为如果你试图访问nil上的一个实例变量,你肯定做错了事(它是否会因此而崩溃:它通常会)。