我是否应该始终为失败的init方法释放self?

leo*_*leo 11 memory cocoa objective-c init

当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;
}
Run Code Online (Sandbox Code Playgroud)

Bra*_*nar 17

如果你的初始化方法中的某些检查失败了,那么你应该释放self.但是请注意,如果[super init]回报率nil是没有意义送释放selfselfnil.这实际上是Apple不赞成的:

你应该只[self release]在失败时打电话.如果nil从超类的初始化程序的调用中返回,则不应该调用release.

例:

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

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

   return self;
}
Run Code Online (Sandbox Code Playgroud)

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