2012-08-04 159 views
5

在iOS應用程序開發中,我們使用NSAutoreleasePool在稍後的時間點放棄對象的所有權。爲什麼我們需要爲每個線程使用NSAutoreleasepool?

但爲什麼它可以在不同的線程之間共享?

爲什麼我們需要在使用新線程時創建一個新的autoreleasepool?

編輯:

正如taskinoor提到我的問題是,爲什麼這樣的設計是在這樣一種方式,每個線程應該有一個單獨autoreleasepool。

+1

[這個問題似乎與你的問題非常相關](http://stackoverflow.com/questions/4547652/does-every-thread-need-its-own-autorelease-pool) – 2012-08-04 13:05:13

+1

你應該考慮使用'@ autoreleasepool {...}而不是'NSAutoreleasePool'。根據文件,它更有效率。如果你遷移到ARC,這是強制性的。 – 2012-08-04 13:07:03

+0

我不知道你爲什麼需要這個編輯,我的回答解釋了它的原因:) – 2012-08-04 13:18:49

回答

5

多線程自動釋放池的設計挑戰是何時排除它們。如果在對象仍在使用時耗盡游泳池,則會崩潰。每個線程都可以很容易地判斷出您是否在運行循環之外,從而可以排除自動釋放的對象。在多線程情況下,您的線程需要在runloop結束時進行同步,因此您可以確定自己處於安全的狀態以排除它們。以這種方式同步踏板是一個壞主意,它會產生大量空閒時間並減慢程序速度。

+1

更進一步;如果任何線程被阻塞等待任何事情 - 網絡,線程狀態,其他I/O - 那麼總體池不能被耗盡。 – bbum 2012-08-04 16:09:08

0

我不認爲自動釋放池線程之間共享,根據apples memory management guide可可每個線程都有自己的自動釋放池

的堆棧如果沒有爲您創建線程或一個自動釋放池分離,然後自動釋放功能不起作用,所以內存佔用將增長

2

每個線程是一個不同的執行上下文 - 一個線程可能遲早會退出,他們可能會使用不同的生命週期和內存管理需求的資源,所以每個線程線程應該被獨立管理。

1

因爲他們以這種方式設計。我想你的問題是他們爲什麼這樣設計的。我不是100%肯定的,但一個可能的原因可能是跨線程共享資源具有成本。在對共享池的每次修改期間,每個線程都需要鎖定解鎖以降低性能。只有在需要共享的情況下,資源應該在多個線程之間共享,而autorelease池則不是這樣。使用專用的autorelease池會表現更好。這可能是這個設計決定的一個可能的原因。

+0

謝謝Taskinoor – Krishnan 2012-08-04 13:32:13

+1

好猜,但不完整。自動釋放池必須是每線程的,因爲如果沒有*所有線程*處於其池可能被耗盡的狀態,就無法安全地排空池。如果*任何線程*被阻塞等待輸入,則漏失不會發生。 Jeffeery的回答是正確的。 – bbum 2012-08-04 16:08:12

+1

@bbum,謝謝。我並沒有想過要把池子倒掉,我同意傑弗瑞的答案比我的好。 – taskinoor 2012-08-04 16:21:59