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

时间:2010-03-18 05:22:33

标签: objective-c cocoa memory 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;
}

1 个答案:

答案 0 :(得分:17)

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

  

您应该只在失败时致电nil。如果从超类的初始化程序的调用中得到release,则不应该调用- (id)init { self = [super init]; if(self) { // do some init stuff if (somethingFailed) { [self release] self = nil; } } return self; }

示例:

{{1}}

另请参阅Handling Initialization Failure

上的Mac开发人员中心文档