如果你不检查[super init]并尝试初始化nil会发生什么?

时间:2014-04-15 10:01:44

标签: objective-c initialization null self super

我知道之前已经讨论过这个问题,例如:In Objective-C why should I check if self = [super init] is not nil?

- (instancetype)init
{
    self = [super init];    // Is potentially nil

    if (self)
    {
        // Initialization code here…
    }

    return self;
}

我理解self可能是nil,但为什么这很重要?我所看到的所有回答只是说self可能是nil,但不解释为何重要。如果您向nil发送消息,则不会发生任何事情。您不会检查任何其他代码(在某些情况下除外),那么为什么需要在init中执行此操作?

2 个答案:

答案 0 :(得分:1)

  

如果您发送消息为零,则不会发生任何事情。

这是正确的,因为运行时(messenger函数)在实际调用方法之前检查nil

但是,如果您将self设置为nil 它位于方法调用的中间,则任何直接实例变量访问都会触发空指针取消引用:

self.myVar = ...;  // fine
_myVar = ...;     // fine

self = nil;

self.myVar = ...;  // fine
_myVar = ...;     // wrong

答案 1 :(得分:0)

部分约定,部分是正确的,但它确实取决于您要使用self设置的内容。

在某些情况下,您将进行大量配置,并且在实际不使用时创建所有配置是浪费。

在某些情况下,您可能会将nil传递给某些会在您执行此操作时引发异常的配置,因此检查并且不进行该调用是合理的。

遵循约定是一种安全和适当的方法,它实际上不会花费你任何东西(它是由模板代码为你创建的)。

相关问题