我开始研究我们的高级代码所做的代码,我发现init方法总是有代码-(id)init
方法。他们通过以下方式使用代码。以下代码用于所有viewControllers。
self = [super initWithNibName:@"ViewController" bundle:[NSBundle mainBundle]];
return self;
此部分中if(self)
和self
的用途是什么?
//And in some viewcontroller contains.
self = [super initWithNibName:@"ViewController" bundle:[NSBundle mainBundle]];
if (self) {
//Do some stuff
}
return self;
答案 0 :(得分:3)
当您在方法中访问实例变量时,代码等同于通过自我指针解决它们:
- (void)method {
iVar = 1;
// actually the following line will be executed:
self->iVar = 1;
}
因此,如果由于某种原因自我指针为零并且您在init方法中访问您的ivars,您的应用程序将崩溃,因为您将尝试derefenrence null指针。例如以下简单示例将崩溃:
@implementation TestObj {
int a;
}
- (id) init {
self = [super init];
self = nil;
a = 1; // Crash
return self;
}
@end
此外,如果您的[super init]方法因任何原因返回nil,则可能表明出现了问题,您不应继续进行对象初始化以及任何其他必需的工作。
答案 1 :(得分:2)
检查自我是否存在的代码:
if (self) {
//Do some stuff
}
return self;
仅在您需要设置初始属性值时才需要。这就是为什么有评论
// Do some stuff
如果您不打算为变量或属性设置任何初始值,则不需要检查self,并且可以立即return self
。
答案 2 :(得分:2)
if (self)
正在检查对super的调用是否在初始化后实际返回了一个对象。如果出现问题,继续是没有意义的,它也会产生运行时错误。
请记住,init方法应该初始化您为其创建类的类型的对象,并返回该对象。你的init方法会覆盖super方法,这就是你调用super的原因,所以先运行Apple的代码,然后用uIViewController上的init方法返回的对象做一些事情。
然后,当然,你的init方法也必须返回该对象(self)。
答案 3 :(得分:1)
[super initWith...]
方法总是有可能失败,因此返回的self
为零,因为它尚未创建。
在这种情况下,在对其进行操作之前,测试self
是否已正确初始化是一种很好的做法。
if (self)
实际上是一个"快捷方式"到if (self != nil)
,因为任何有效对象都有一个非空的内存地址,因此if
测试将使用不同于0(null)的任何内容进行测试。
答案 4 :(得分:-1)
if(self)
正在检查以确保在'self'
实际开始执行之前存在if(self)
。
self是一个对象,所以如果它不存在那么self将是未定义的,{{1}}将评估为false,跳过代码块。