2013-03-29 34 views
2

我有個問題關於自動釋放,現在我有代碼如下:autorelease和runloop和線程的關係?

int main(int argc, char *argv[]){ 
@autoreleasepool { 
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 
}} 

該文檔說在@autoreleasepool的端部{}標記爲自動釋放該對象將接收一個釋放消息。但UIApplicationMain永遠不會返回,這意味着流將永遠不會到達@autoreleasepool的末尾,那麼標記爲autorelease的對象將永遠不會釋放,直到應用程序死亡。有沒有autorelease的意義.....

我問過誰說iOS系統會產生一些線程,(你知道,一個線程,一個runloop)。他說,runloop將創建autorelease池所以autorelease對象會在thead或runloop結尾處釋放。但是我們使用主線程的最多情況是,他所說的並不能說服我。

什麼時候使用autorelease.It困惑了我很長一段時間。

我再弄點自動釋放對象會得到釋放,當一個runloop端(主runloop將存在的所有應用程序的生命?),所以我不知道..

任何一點及其相關文件將不勝感激!

+1

我問了同樣的問題。對於什麼是可接受的行爲來說,這很可能是語義/演示的原因。 UIApplicationMain的唯一出路是程序「退出()」,所以任何內存都會返回到操作系統。 – borrrden

+0

是的,你是對的。 – frank

回答

5

是的,從技術上說,UIApplicationMain永遠不會返回,所以從來沒有碰到那@autoreleasepool塊的結尾,所以在這種情況下,如果你刪除了@autoreleasepool塊它也就沒有什麼區別(除了也許事情抱怨他們已經沒有自動釋放其他一個自動釋放池)。但是,可以想象一個main函數的編寫方式並不總是調用UIApplicationMain(可能不在iOS應用程序中,但通常情況下)。那麼它會有所作爲。

這僅僅是很好的做法,始終把一個@autoreleasepool塊周圍的每一個線程的入口點的身體,main是主線程的入口點。所以爲了一致性,總是把它放在那裏是有道理的。

你與之談論的人是在UIApplicationMain裏面有一個運行循環(一個處理事件的無限循環),在每次迭代中都有一個自動釋放池(或者每隔幾次迭代;它是一個實施細節)。這與main中的自動釋放池沒有任何關係。

+0

謝謝。我想我應該閱讀更多文檔。 – frank