11

当 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;
}
4

1 回答 1

17

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

您应该只[self release]在故障点调用。如果您nil从调用超类的初始化程序返回,您也不应该调用release.

例子:

- (id)init
{
   self = [super init];
   if(self) {
       // do some init stuff

       if (somethingFailed)
       {
          [self release]
          self = nil;
       }
   }

   return self;
}

另请参阅有关处理初始化失败的 Mac 开发中心文档

于 2010-03-18T05:28:33.787 回答