2011-07-06 49 views
7

NSAutoreleasePool ..應該只有一個?爲什麼你想要多一個?你是否希望有一個以上的游泳池作爲單個課程的一部分?我們可以有多個NSAutoReleasePools嗎?爲什麼這是必要的?

如果您有多個池,哪一個會包含要求[autorelease] d的對象?有沒有辦法找出哪些對象等待作爲池的一部分自動發佈?

對不起,20個問題,請幫我更好地理解這種

回答

12

NSAutoreleasePool ..應該有 只有一個?

不,不一定。您可以根據需要創建儘可能多的自動釋放池。

爲什麼要有更多的 一個?你是否希望有更多 作爲單個 課程的一部分?

這個想法是讓你的記憶「高水位」儘可能低。使用autorelease是推遲釋放你的對象,直到「稍後」的作弊。有時候你知道什麼時候會「稍後」 - 在這種情況下,製作自己的自動釋放池可能很明智。

這是什麼意思?那麼,想象你有以下循環:

for (...) 
{ 
    // 1 MB of objects are added to the autorelease pool by some code... 
} 

1 MB是很多!如果代碼循環了20次,您將有20MB的對象等待發布。更糟糕的是,如果它的運行時間不確定或不確定,您的應用程序可能會崩潰。如果你知道這些代碼是自包含的,你可以強制任何被放入自動釋放池,該塊內獲得通過手動創建自己的自動釋放池,像這樣公佈:

for (...) 
{ 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    // 1 MB of objects are added to the autorelease pool by some code... 
    [pool drain]; 
} 

現在你的「高水位標記「只有1MB而不是20MB(或更多!)。

如果你有多個游泳池,其中一個 將包含被要求提供 對象是[自動釋放] d?

最近的一個。

想象一下擁有全局堆棧。當你初始化一個新的AutoreleasePool時,它會自動添加到這個全局的autorelease池中。當您在對象上調用[xxx autorelease]時,autorelease方法在此堆棧頂部的autorelease池上查看,並將其自身添加到該autorelease池的對象列表中。當您撥打[pool drain]時,該池循環遍歷所有已添加到其中的參考文獻,並在所有參考文獻中調用[xxx release]。由於BJ霍默指出,上面的段落中的堆棧實際上並不是真正的全局 - 實際上每個線程有一個堆棧。但我無法弄清楚如何重寫上面的段落並通過使用諸如「線程本地」之類的術語使其易於理解......所以......本附錄將足以:)

+1

嗯,它實際上是一個線程本地堆棧,而不是全局堆棧。但否則寫得很好。 –

+0

@BJ荷馬,謝謝,好點。發佈更新。 – Steve

相關問題