2009-11-16 179 views
0

我的問題是關於+ planet創建的對象的範圍。我被告知,「自動釋放的對象將停留在方法/函數的持續時間,它們是在」「中創建的。在我的示例中,我假設行星實例的範圍在main()內,而不在方法內我做初始alloc/init?類方法實例範圍?

+(Planet *) planet { 
    gPlanetCount++; 
    return [[[self alloc] init] autorelease]; 
} 

int main(int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    Planet *outerMost; 

    outerMost = [Planet planet]; 
    ... 
    ... some code 
    ... 
    [pool drain]; 
    return 0; 
} 

EDIT_001

int main(int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    Planet *outerMost; 

    outerMost = [[Planet planet] retain]; // Added retain 
    ... 
    ... some code 
    ... 
    [outerMost release]; // Added release 
    [pool drain]; 
    return 0; 
} 

加里

回答

5

自動釋放對象始終有效,直到周圍的NSAutoreleasePool被排空。在你的例子中,這涵蓋了主要方法。

通常在運行循環結束時釋放自動釋放的對象。所以如果你調用一個返回自動釋放對象的方法,它仍然在你的函數體中有效,直到你手動排除周圍的NSAutoreleasePool,或者你從一個從運行循環中調用的方法返回。

4

自動釋放物體將保持周圍,直到當前運行的循環(在該時間自動釋放池將被排出)的端部,或直至自動釋放池是手動排空。

它與創建它們的位置無關 - 只是當創建池時以及該池被耗盡時,哪些池處於活動狀態。

編輯:

自動釋放池的目的是很難理解,如果你不把它們放到上下文。在程序性應用程序中使用自動釋放池而不是事件驅動的應用程序並不總是有意義的。如果你有一個無限循環的應用程序,那麼你會想要不時地耗盡游泳池。以下是它如何更有意義:

begin application 

begin endless loop 
    create autorelease pool 

    // process messages from the event queue (mouseclicks, keypresses etc) and 
    // do stuff here - this might create autoreleased object 

    drain autorelease pool 
end of endless loop 

end application 

自動釋放池在每次迭代時都耗盡。需要注意的是,如果在單個循環迭代中進行大量處理,池可能會變得非常充足。在這種情況下,您可以手動排空游泳池。

2

關於「自動釋放對象將留在它們創建的方法/函數的持續時間」的說明是過於簡單化,並且它假定您正在做的事情是「可可方式」。在main()中放置「真正的代碼」並不是Cocoa的方式,所以你會遇到更爲直接的答案,這是其他人給你的完美答案。當您的自動釋放池被刷新時,事情就會消失。

什麼的說明實際上的意思是,當你在一個函數創建對象,可以肯定的是,對象可以呆在身邊至少直到你的函數,結束,只要你不沖水自動釋放池自己。這意味着如果您只使用該函數中的對象,則不需要在該函數中保留和釋放該對象。如果你手動刷新自動釋放池,你應該知道什麼時候事情消失的實際規則(同樣,frenetisch applaudierend在這裏是正確的),並且大多忽略簡化。