如果我们不在init方法中检查“if(self)”会发生什么?

时间:2014-03-24 11:43:08

标签: ios objective-c self

我开始研究我们的高级代码所做的代码,我发现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;

5 个答案:

答案 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,跳过代码块。