2010-03-18 92 views
11

当我在初始化内部发生故障时,是否应该始终释放自我,或者是否应该只在首次初始化实例变量时才这样做?我应该始终为失败的初始化方法释放自我吗?

换言之,这种模式是否有效?是否有一段时间我不应该在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; 
} 

回答

17

如果有的检查你需要在你的初始化方法失败,那么你应该发布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

+0

阿Mac开发中心的文件,现在你指出来一点非常明显。我有点被抛弃,因为我调用了一个对象,我没有调用alloc/copy/new等。 – leo 2010-03-18 05:40:08

+1

是的,基本的原则是,初次遇到初始化错误的人应该释放init被调用的分配空间,然后返回nil。由于其他人都是零,他们没有办法释放内存,所以为什么你应该调用release来避免内存泄漏。 – 2010-03-18 05:49:09

+0

有道理,谢谢。 – leo 2010-03-18 05:51:23