实现像这样的Objective C init方法有什么意义?

时间:2011-09-09 23:02:07

标签: iphone objective-c ios cocoa-touch

  

可能重复:
  In Objective-C why should I check if self = [super init] is not nil?

我经常看到这个“if(self = [super init])”构造,我想知道它为什么会这样做。

- (id) init {

  if (self = [super init]) {

    // how could self = [super init]; ever fail?

  }

  return self;

}

3 个答案:

答案 0 :(得分:5)

想象一下你的超类做到了这一点:

- (id)init {
    self = [super init];

    if (self) {
        self->foo = CreateExpensiveWidgetOverTheInternetByTrain();
        if (!self->foo) {
            // widget creation failed, bail out
            [self release];
            self = nil;
        }
    }

    return self;
}

就是这样。 ;)

答案 1 :(得分:1)

[super init]可能有多种失败方式:

  1. 您正在尝试子类化“final”类,即专门设计为不允许子类化的类。

  2. 你失去了记忆,运气不好。

  3. initWithArgument:parameter:的情况下;你提供了无效的参数或参数。

  4. 另外,其他不太明显的方法;这通常是最危险的。

答案 2 :(得分:0)

来自the documentation

  

通常,如果在初始化方法期间出现问题,您应该在release上调用self方法并返回nil

     

此政策有两个主要后果:

     
      
  • 从初始化方法接收nil的任何对象(无论是您自己的类,子类还是外部调用者)都应该能够处理它。如果调用者在调用之前已经建立了对该对象的任何外部引用,则必须撤消任何连接。
  •   
  • 在存在部分初始化对象的情况下,您必须确保dealloc方法是安全的。
  •