2014-01-13 51 views
1

在約NSAutoReleasePool https://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/Classes/NSAutoreleasePool_Class/Reference/Reference.html 它指向的是 「的應用開發包在事件循環的每個週期的開始創建主線程自動釋放池」蘋果API參考。Runloop和autoreleasePool

它困惑我。我對此有三個問題。

1)什麼是「應用套件」? UIKit的?如果「The Application Kit」是指UIKit,那麼我創建一個不使用UIkit的應用程序。它會在事件循環的每個循環開始時在主線程上創建一個autoreleasePool嗎?

2)「在主線程上」是指在其他線程上(Not mainThread)會打破這個規則?

3)「事件循環」是指runloop?

# #

地址: 我寫的一個演示,以測試它。當我創建一個線程時,會自動通過runloop創建一個autoreleasePool?

enter image description here enter image description here

然後,在應用MainThread,創建taskThread。 enter image description here

結果: enter image description here

所以,問題2)是「在主線程」是指在其他線程(不mainThread)將打破這個規則? 在這個演示中,事實並非如此。每個runloop的第二個線程會自動創建一個autoreleasePool。因爲autoreleaseObject的dealloc方法被調用。

我的演示有什麼問題嗎?它讓我困惑。

回答

1
  1. 您正在查看Mac文檔。 AppKit是UIKit的Macintosh版本。兩者都有關於autorelease池的幾乎相同的邏輯
  2. 是的。一個新線程不會自動擁有一個autorelease池或一個事件循環。話雖如此,大多數時候你不會自己創建新線程。有喜歡的GCD和的NSOperation事情做太多的你所需要的,無需進行手動東西
  3. 我認爲這個目的的這一點,是
+0

1.將它在開始創建主線程上autoreleasePool事件循環的每個循環都不是基於UIKit? 2.我寫一個演示來測試它。我創建了一個沒有autoreleasePool的線程。在這個線程中,我創建了一個autorelease對象。當線程結束時,調用autorelease Object dealloc。爲什麼? –

+0

1.否,因爲運行循環是UIKit/AppKit的屬性。毫無疑問,其他框架將會有一個。 2.「在Objective-C框架中鏈接的應用程序通常必須在其每個線程中至少創建一個自動釋放池」https://developer.apple.com/library/ios/documentation/cocoa/conceptual/Multithreading/CreatingThreads/CreatingThreads .html –

+0

1. Runloop是UIKit的一個屬性嗎?我不這麼認爲。每個線程都有一個且只有一個runloop,它根據需要自動創建。 2。我寫這個demo想測試wheather,第二個線程每個runloop都會創建autoreleasePool,Only。 –