【问题标题】:Should I always release self for failed init methods?我应该总是为失败的初始化方法释放自我吗?
【发布时间】:2011-01-28 21:20:01
【问题描述】:

当 init 内部出现故障时我应该总是释放 self,还是应该只在我首先初始化实例变量时才这样做?

换句话说,这种模式有效吗?是否有一段时间我不应该在 init 方法中释放 self,或者我应该假设如果控制流进入 init,self 的保留计数至少为 1?

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

 //do some init stuff
 if (somethingFailed)
 {
  [self release];
  return nil;
 }
 return self;
}

【问题讨论】:

    标签: objective-c cocoa memory init


    【解决方案1】:

    如果您在初始化方法中需要的某些检查失败,那么是的,您应该释放self。但是请注意,如果[super init] 返回nil,则将释放发送到self 是没有意义的,因为selfnil。这实际上是苹果不赞成的:

    您应该只在发生故障时调用[self release]。如果你从调用超类的初始化程序得到nil,你不应该也调用release

    例子:

    - (id)init
    {
       self = [super init];
       if(self) {
           // do some init stuff
    
           if (somethingFailed)
           {
              [self release]
              self = nil;
           }
       }
    
       return self;
    }
    

    另请参阅Handling Initialization Failure 上的 Mac 开发中心文档

    【讨论】:

    • 啊,现在你指出来似乎很明显。我有点被甩了,因为我在一个没有调用 alloc/copy/new 等的对象上调用 release。
    • 是的,基本原则是,谁在初始化中首先遇到错误,就应该释放调用init的分配空间,然后应该返回nil。由于其他人都为零,他们无法释放内存,因此为什么你应该在 self 上调用 release 以避免内存泄漏。
    • 奇怪的是文档会明确告诉你不要向 nil 发送消息,因为什么都不应该发生。
    • @tedge 我也是这么想的,因为向 nil 发送 release 被明确定义为无操作。
    猜你喜欢
    • 2012-03-19
    • 2012-10-29
    • 1970-01-01
    • 2011-03-21
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多