2010-03-18 60 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