我正在从Paul Hegarty的Stanford CS193P学习。然后我看到这样的东西,我也看到其他人使用:
- (id)init
{
self = [super init];
if (self) {
[self someSetupFunctions];
}
return self;
}
这不是多余的吗?为什么不直接使用:
- (id)init
{
self = [super init];
[self someSetupFunctions];
return self;
}
我认为这些消息只是失败,所以为什么不使用第二种格式呢?
答案 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
上的一个实例变量,你肯定做错了事(它是否会因此而崩溃:它通常会)。