Objective c init方法中的[自释放]、[自解除锁定]或[超级解除锁定]?

Objective c init方法中的[自释放]、[自解除锁定]或[超级解除锁定]?,objective-c,cocoa,Objective C,Cocoa,我刚刚读了一些关于如何正确地在init方法中失败的文章,这些文档似乎彼此不一致。一个建议抛出异常,而其他建议清理并返回nil。当前的最佳实践是什么?我一直使用的方法是清除并返回nil。您在问题标题中提到的三种方法可能会导致调用层次结构中更高的segfaults,而返回nil则不会。我相信苹果公司的医生们自己也说过,一旦失败,他们将以零回报。您在哪里发现差异?我认为普遍接受的做法是失败时返回零。但您确实希望释放self以避免泄漏: -(id)init { if (self = [super i

我刚刚读了一些关于如何正确地在init方法中失败的文章,这些文档似乎彼此不一致。一个建议抛出异常,而其他建议清理并返回nil。当前的最佳实践是什么?

我一直使用的方法是清除并返回nil。您在问题标题中提到的三种方法可能会导致调用层次结构中更高的segfaults,而返回nil则不会。我相信苹果公司的医生们自己也说过,一旦失败,他们将以零回报。您在哪里发现差异?

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

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

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

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

正确的解决方案(异常和/或
[self release];返回nil;
)已经涵盖,我将解决不正确的解决方案

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


Double不要使用
super
直接发送。这将跳过您自己的
dealloc
实现。

只返回nil将泄漏内存,由于对alloc的调用将创建一个保留计数为1的对象。内存泄漏是我想要避免的。文档链接:初始化期间的错误检测-实现初始值设定项-您会注意到,在第二个链接中的示例代码下,他们建议改为引发异常。我很确定这不是当前的最佳实践。我相信所提到的异常意味着在输入为nil(非法参数)时抛出异常。我总是使用NSParameterAssert(…)验证方法的参数,即使在init方法中也是如此。这是标准做法,因为它代表的是编程错误,而不是运行时错误。感谢各位的反馈。这就是我正在做的事情,我认为这是正确的方法,但文件中提到的其他两种方法让我想到可能有一些特殊情况需要注意。