我应该总是为失败的初始化方法释放自我吗?

Posted

技术标签:

【中文标题】我应该总是为失败的初始化方法释放自我吗?【英文标题】: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;

【问题讨论】:

【参考方案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 被明确定义为无操作。

以上是关于我应该总是为失败的初始化方法释放自我吗?的主要内容,如果未能解决你的问题,请参考以下文章

errno 在 VxWorks PPC 中总是返回零

未初始化的整数在c中总是默认为0吗?

手动调用析构函数总是糟糕设计的标志吗?

释放指针后真的应该将指针设置为“NULL”吗?

java小程序applet里不能写线程吗?创建线程编译能通过,但是运行小程序会初始化失败。应该怎么

stm32c8t6初始化mpu6050失败,总是返回8问题的解决