首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >init方法中的[self release]、[self dealloc]或[super dealloc]?

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

Stack Overflow用户
提问于 2009-05-25 16:25:09
回答 4查看 4.2K关注 0票数 12

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-05-25 17:06:29

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

代码语言:javascript
复制
-(id)init
{
  if (self = [super init]) {
    ...
    if (thingsWentWrong) {
      [self release];
      return nil;
    }
    ...
  }
  return self;
}
票数 16
EN

Stack Overflow用户

发布于 2009-05-25 18:06:23

在介绍了正确的解决方案(异常和/或[self release]; return nil;)之后,我将介绍不正确的解决方案。

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

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

票数 9
EN

Stack Overflow用户

发布于 2009-05-25 17:15:51

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

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/907311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档