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

Kev*_*vin 12 cocoa objective-c

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

n8g*_*ray 16

我相信普遍接受的做法是在失败时返回零.但你确实希望释放自我以避免泄漏:

-(id)init
{
  if (self = [super init]) {
    ...
    if (thingsWentWrong) {
      [self release];
      return nil;
    }
    ...
  }
  return self;
}
Run Code Online (Sandbox Code Playgroud)


Pet*_*sey 9

[self release]; return nil;已经涵盖了正确的解决方案(例外和/或),我将解决不正确的解决方案.

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

双 - 不要用来super直接发送它.那会跳过你自己的dealloc实现.


Jen*_*fke 6

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

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