Iphone 实现这样的目标C init方法有什么意义?

Iphone 实现这样的目标C init方法有什么意义?,iphone,objective-c,ios,cocoa-touch,Iphone,Objective C,Ios,Cocoa Touch,可能重复: 我经常看到这个“if(self=[super init])”构造,我想知道为什么会这样做 - (id) init { if (self = [super init]) { // how could self = [super init]; ever fail? } return self; } 假设您的超类执行以下操作: - (id)init { self = [super init]; if (self) { se

可能重复:

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

- (id) init {

  if (self = [super init]) {

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

  }

  return self;

}

假设您的超类执行以下操作:

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

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

    return self;
}

就是这样

有很多方法可以失败:

  • 您正试图对“
    final
    ”类进行子类化,即专门设计为不允许子类化的类

  • 你失去了记忆,也失去了运气

  • initWithArgument的情况下:参数:
    ;您提供的参数或参数无效

  • 还有其他不太明显的方式;哪些通常是最危险的。

    来自:

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

    这一政策有两个主要后果:

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

    谢谢你的评论,这是个骗局。我投票决定关闭而不是删除。。。我不确定正确的方法是什么。相同的区别。当您投票关闭时,选择“精确复制”,您将能够指定重复的消息。据我所知,评论是自动的。