NSAutoreleasePool ..應該只有一個?爲什麼你想要多一個?你是否希望有一個以上的游泳池作爲單個課程的一部分?我們可以有多個NSAutoReleasePools嗎?爲什麼這是必要的?
如果您有多個池,哪一個會包含要求[autorelease] d的對象?有沒有辦法找出哪些對象等待作爲池的一部分自動發佈?
對不起,20個問題,請幫我更好地理解這種
NSAutoreleasePool ..應該只有一個?爲什麼你想要多一個?你是否希望有一個以上的游泳池作爲單個課程的一部分?我們可以有多個NSAutoReleasePools嗎?爲什麼這是必要的?
如果您有多個池,哪一個會包含要求[autorelease] d的對象?有沒有辦法找出哪些對象等待作爲池的一部分自動發佈?
對不起,20個問題,請幫我更好地理解這種
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霍默指出,上面的段落中的堆棧實際上並不是真正的全局 - 實際上每個線程有一個堆棧。但我無法弄清楚如何重寫上面的段落並通過使用諸如「線程本地」之類的術語使其易於理解......所以......本附錄將足以:)
嗯,它實際上是一個線程本地堆棧,而不是全局堆棧。但否則寫得很好。 –
@BJ荷馬,謝謝,好點。發佈更新。 – Steve