init方法中的[self release],[self dealloc]或[super dealloc]?

时间:2009-05-25 16:25:09

标签: objective-c cocoa

我刚刚开始阅读如何在init方法中正确失败,并且文档似乎彼此不同意。一个建议抛出异常,而其他人建议清理并返回零。目前最好的做法是什么?

4 个答案:

答案 0 :(得分:16)

我认为普遍接受的做法是在失败时返回零。但你确实希望释放自我以避免泄密:

-(id)init
{
  if (self = [super init]) {
    ...
    if (thingsWentWrong) {
      [self release];
      return nil;
    }
    ...
  }
  return self;
}

答案 1 :(得分:9)

已涵盖正确的解决方案(例外和/或[self release]; return nil;),我将解决错误的解决方案。

不要直接发送dealloc。这是release的工作。 (如果您的代码在GC下运行,dealloc不适用,我只能推测调用它会导致什么问题。)

请勿使用super直接发送。这将跳过您自己的dealloc实施。

答案 2 :(得分:6)

Cocoa关于异常的理念是它们只应该在程序员错误的情况下抛出,比如将非法参数传递给方法。如果出现其他问题,该方法应该只返回NO或nil,并希望通过NSError **“out”参数报告详细信息。

这包括-init方法。如果错误情况可能在成品中合法地发生,那么该方法应该释放self(以避免泄漏)并返回nil。

答案 3 :(得分:0)

我一直使用的方法是清理并返回零。您在问题标题中提到的三种方法可能会导致调用层次结构中的段错误更高,而返回nil则不会。我相信Apple博士自己说会在失败时归零。你在哪里发现差异?