在iOS應用程序開發中,我們使用NSAutoreleasePool
在稍後的時間點放棄對象的所有權。爲什麼我們需要爲每個線程使用NSAutoreleasepool?
但爲什麼它可以在不同的線程之間共享?
爲什麼我們需要在使用新線程時創建一個新的autoreleasepool?
編輯:
正如taskinoor提到我的問題是,爲什麼這樣的設計是在這樣一種方式,每個線程應該有一個單獨autoreleasepool。
在iOS應用程序開發中,我們使用NSAutoreleasePool
在稍後的時間點放棄對象的所有權。爲什麼我們需要爲每個線程使用NSAutoreleasepool?
但爲什麼它可以在不同的線程之間共享?
爲什麼我們需要在使用新線程時創建一個新的autoreleasepool?
編輯:
正如taskinoor提到我的問題是,爲什麼這樣的設計是在這樣一種方式,每個線程應該有一個單獨autoreleasepool。
多線程自動釋放池的設計挑戰是何時排除它們。如果在對象仍在使用時耗盡游泳池,則會崩潰。每個線程都可以很容易地判斷出您是否在運行循環之外,從而可以排除自動釋放的對象。在多線程情況下,您的線程需要在runloop結束時進行同步,因此您可以確定自己處於安全的狀態以排除它們。以這種方式同步踏板是一個壞主意,它會產生大量空閒時間並減慢程序速度。
更進一步;如果任何線程被阻塞等待任何事情 - 網絡,線程狀態,其他I/O - 那麼總體池不能被耗盡。 – bbum 2012-08-04 16:09:08
我不認爲自動釋放池線程之間共享,根據apples memory management guide可可每個線程都有自己的自動釋放池
的堆棧如果沒有爲您創建線程或一個自動釋放池分離,然後自動釋放功能不起作用,所以內存佔用將增長
每個線程是一個不同的執行上下文 - 一個線程可能遲早會退出,他們可能會使用不同的生命週期和內存管理需求的資源,所以每個線程線程應該被獨立管理。
因爲他們以這種方式設計。我想你的問題是他們爲什麼這樣設計的。我不是100%肯定的,但一個可能的原因可能是跨線程共享資源具有成本。在對共享池的每次修改期間,每個線程都需要鎖定解鎖以降低性能。只有在需要共享的情況下,資源應該在多個線程之間共享,而autorelease池則不是這樣。使用專用的autorelease池會表現更好。這可能是這個設計決定的一個可能的原因。
[這個問題似乎與你的問題非常相關](http://stackoverflow.com/questions/4547652/does-every-thread-need-its-own-autorelease-pool) – 2012-08-04 13:05:13
你應該考慮使用'@ autoreleasepool {...}而不是'NSAutoreleasePool'。根據文件,它更有效率。如果你遷移到ARC,這是強制性的。 – 2012-08-04 13:07:03
我不知道你爲什麼需要這個編輯,我的回答解釋了它的原因:) – 2012-08-04 13:18:49