關於run loop的幾點說明


1.3.1 Cocoa中的NSRunLoop類並不是線程安全的

我們不能再一個線程中去操作另外一個線程的run loop對象,那很可能會造成意想不到的後果。不過幸運的是CoreFundation中的不透明類CFRunLoopRef是線程安全的,而且兩種類型的run loop完全可以混合使用。Cocoa中的NSRunLoop類可以通過實例方法:

- (CFRunLoopRef)getCFRunLoop;

獲取對應的CFRunLoopRef類,來達到線程安全的目的。

1.3.2 Run loop的管理並不完全是自動的。

我們仍必須設計線程代碼以在適當的時候啓動run loop並正確響應輸入事件,當然前提是線程中需要用到run loop。而且,我們還需要使用while/for語句來驅動run loop能夠循環運行,下面的代碼就成功驅動了一個run loop:

     BOOL isRunning = NO;

      do {

            isRunning = [[NSRunLoop currentRunLooprunMode:NSDefaultRunLoopMode beforeDate:[NSDatedistantFuture]];

     } while (isRunning);

1.3.3 Run loop同時也負責autorelease pool的創建和釋放

在使用手動的內存管理方式的項目中,會經常用到很多自動釋放的對象,如果這些對象不能夠被即時釋放掉,會造成內存佔用量急劇增大。Run loop就爲我們做了這樣的工作,每當一個運行循環結束的時候,它都會釋放一次autorelease pool,同時pool中的所有自動釋放類型變量都會被釋放掉。

1.3.4 Run loop的優點

一個run loop就是一個事件處理循環,用來不停的監聽和處理輸入事件並將其分配到對應的目標上進行處理。如果僅僅是想實現這個功能,你可能會想一個簡單的while循環不就可以實現了嗎,用得着費老大勁來做個那麼複雜的機制?顯然,蘋果的架構設計師不是喫乾飯的,你想到的他們早就想過了。

首先,NSRunLoop是一種更加高明的消息處理模式,他就高明在對消息處理過程進行了更好的抽象和封裝,這樣你不用處理一些很瑣碎很低層次的具體消息的處理,在NSRunLoop中每一個消息就被打包在input source或者是timer source(見後文)中了。

其次,也是很重要的一點,使用run loop可以使你的線程在有工作的時候工作,沒有工作的時候休眠,這可以大大節省系統資源。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章