2010-07-08 52 views
1

我的問題是什麼時候一個對象被實際添加到autorelease池? 創建自動釋放池並在該範圍內聲明對象時,是將它們添加到自動釋放池中,還是將它們指定爲自動釋放時添加到池中。在Objective-C中如何處理Autorelease池中的對象?

int main(void) { 
    NSAutoreleasePool *pool; 
    pool = [[NSAutoreleasePool alloc] init]; 
    NSString *string; 
    NSArray * array; 
    string = [[[NSString alloc] init] autorelease]; 
    array = [[NSArray alloc] init]; 
    /* use the string */ 
    [pool drain]; 
} 

在這種情況下只有字符串被添加到池中,或者甚至數組被添加到池中?

回答

0

當對它們調用-autorelease時,對象被添加到autorelease池(是的,池中,每個線程有一堆)。但是,在不包含「新」,「分配」或「複製」這些詞的方法中(或多或少地,我可能會忘記一兩個),返回的值通常會在您返回之前自動釋放。你應該完全閱讀memory management guide(這不是痛苦)。

+0

感謝您的回覆Jared ..我也有另一個疑問是當我創建嵌套池時,我可以使用嵌套池中的對象作爲autorelease,其中對象在父池中創建。 – Cathy 2010-07-08 08:00:32

+0

@Cathy:是的,你可以,但這可能會混淆內存管理 - 正如文檔所說,不要釋放你沒有創建或保留的東西。基本上我不能想到這樣一種情況,即你可以乾淨利落地完成這項工作,儘管它在技術上絕對好,只要你不過度釋放它(通過自動釋放兩次) – 2010-07-08 19:58:34

0

對象被添加到autorelease池只有當他們發送自動釋放方法。

自動釋放池堆棧和對象只添加到堆棧中最上層的池(最近創建的)時自動釋放對象。

但是,autorelease池本身在堆棧下一個池中有效。因此,如果您耗盡最舊的游泳池,那麼自此之後創建的所有游泳池也將被耗盡。這在拋出異常的情況下非常重要。它可以通過帶有自動釋放池的堆棧框架拋出異常,而不會泄漏池或其中的對象。

相關問題