我知道之前已经讨论过这个问题,例如: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
中执行此操作?
答案 0 :(得分:1)
如果您发送消息为零,则不会发生任何事情。
这是正确的,因为运行时(messenger函数)在实际调用方法之前检查nil
。
但是,如果您将self
设置为nil
而它位于方法调用的中间,则任何直接实例变量访问都会触发空指针取消引用:
self.myVar = ...; // fine
_myVar = ...; // fine
self = nil;
self.myVar = ...; // fine
_myVar = ...; // wrong
答案 1 :(得分:0)
部分约定,部分是正确的,但它确实取决于您要使用self
设置的内容。
在某些情况下,您将进行大量配置,并且在实际不使用时创建所有配置是浪费。
在某些情况下,您可能会将nil
传递给某些会在您执行此操作时引发异常的配置,因此检查并且不进行该调用是合理的。
遵循约定是一种安全和适当的方法,它实际上不会花费你任何东西(它是由模板代码为你创建的)。