2011-03-04 50 views
12

我試圖瞭解何時調用autorelease,以及這實際上會對我的對象做些什麼。Objective-C自動釋放內存管理

在Mac Developer Library中閱讀About Memory Management之後,我明白當你有一個充當工廠方法的方法時 - 通過創建一個新對象並返回它 - 該方法在返回它之前無法釋放該對象,因爲這會導致返回釋放的對象。

- (Test *) createNewTest 
{ 
    Test *newInstance = [[Test alloc] init]; 
    [newInstance release]; 
    return newInstance; // deallocted object returned. 
} 

相反,我應該使用autorelease

的自動釋放方法中,通過NSObject的定義,標誌着接收機供以後釋放

我的問題是:如果對象稍後被釋放,我怎麼知道它被釋放的時間?

- (Test *) createNewTest 
{ 
    Test *newInstance = [[test alloc] init]; 
    [newInstance autorelease]; 
    return newInstance; 
} 

- (void) runIt 
{ 
    Test *myInstance = [self createNewTest]; 
    // when is myInstance released?? and thereby not valid to my function anymore? 
} 

我怎麼能放心地使用返回自動釋放對象我runIt方法中,如果當自動釋放發生了,我不知道嗎?我應該保留createNewTest返回的對象嗎?或者我可以在runIt範圍內安全地使用它嗎?

+2

順便說一句 - 由OBJ-C的命名規則,你createNewTest方法應該,因爲它包含「新」在它的名字返回非自動釋放對象。 – Vladimir 2011-03-04 10:13:56

+0

對象使用alloc實例化,所以它必須被釋放。 – Sailesh 2011-03-04 10:24:24

回答

11

將自動釋放的對象添加到自動釋放池。

autorelease池中的對象在主循環迭代結束時釋放(或者如果您正在管理自己的自動釋放池和/或如果調用drain,則會更快)。

當你調用返回一個autoreleased對象的方法,它是非常保證保持有效,直至範圍的至少年底,它被要求收回。

如果你想確保它保持活着更長的時間你應該保留它,記住當你完成它時再次釋放它。

+1

你說「非常有保證」是最好的做法,保留和釋放調用工廠方法的方法? – 2011-03-04 10:22:58

+0

該對象將保持其範圍有效。如果你想要100%的想法,你可以保留/釋放。 – Jasarien 2011-03-04 10:26:46

+0

感謝您的回答:)我只有一個問題,如果runIt()會返回創建的對象將調用runIt()有一個安全的對象以及:)的方法會怎麼樣? – 2011-03-04 10:42:49

0

我怎麼能放心地使用返回 自動釋放對象我runIt 方法裏面,如果我不知道什麼時候 自動釋放觸發?

自動釋放將在當前運行循環結束後觸發。

我是否應該保留由 返回的對象createNewTest?或者我可以安全地在runIt範圍內使用它嗎?

您可以在runIt範圍內安全地使用它。

-1

負責創建它的人和調用runIt的人必須保留該對象。當一個負責人完成它時,它應該釋放該對象。

0

它更好地保留對象並在使用後釋放它。