RunLoop作用
總結下來,RunLoop 的作用主要體現在三方面:
RunLoop 的作用就是來管理線程的,當線程的 RunLoop 開啟后,線程就會在執行完任務后,處于休眠狀態,隨時等待接受新的任務,而不是退出。
1. 保持程序的持續運行
2. 處理App中的各種事件(比如觸摸事件、定時器事件、Selector事件)
3. 節省CPU資源,提高程序性能:該做事的時候做事,該休息的時候休息
就是說,如果沒有 RunLoop 程序一運行就結束了,你根本不可能看到持續運行的 app。
iOS中有2套API訪問和使用RunLoop
Foundation:NSRunLoop
Core Foundation: CFRunLoopRef
NSRunLoop是基于CFRunLoopRef的一層OC包裝,因此我們需要研究CFRunLoopRef層面的API(Core Foundation層面)
RunLoop的mode
mode 主要是用來指定事件在運動循環中的優先級
1)kCFRunLoopDefaultMode:默認Mode,空閑的
2)UITrackingRunLoopMode:界面跟蹤 Mode,用于 ScrollView 追蹤觸摸滑動,保證界面滑動時不受其他 Mode 影響。
3)UIInitializationRunLoopMode:在剛啟動 App 時進入的第一個 Mode ,啟動完成后就不再使用。
4)GSEventReceiveRunLoopMode:接受系統事件的內部 Mode,通常用不到。
5)kCFRunLoopCommonModes:這是一個占位的 Mode,沒有實際作用。
注意:主線程的 RunLoop 里有兩個預置的公開 Mode:
kCFRunLoopDefaultMode 和 UITrackingRunLoopMode。這兩個 Mode 都已經被標記為"Common"
屬性。另外也可以手動將Mode標記為"Common"
系統Autorelease pool的釋放時機
每個runloop中都創建一個Autorelease Pool,并在runloop的末尾進行釋放,所以,一般情況下,每個接受autorelease消息的對象,都會在下個runloop開始前被釋放。也就是說,在一段同步的代碼中執行過程中,生成的對象接受autorelease消息后,一般是不會在作用域結束前釋放的。Autorelease對象出了作用域之后,會被添加到最近一次創建的自動釋放池中,并會在當前的 runloop 迭代結束時釋放。
關于ScrollView滑動時,Timer失效問題
應該是因為UIScrollView滾動的時候跟主線程不是同一個runloop mode,一個runloop mode就是
input sources、timer和observers的集合。每次執行runloop,都需要指定一個mode。
UIScrollView滾動時候由于不同的mode所以也導致它只能保證它所在的runloop的timer有效,而主線程無效。
RunLoop和線程的關系
RunLoop就是用來管理線程的,當線程的RunLoop開啟后,線程在執行完任務后不會退出,而是處于休眠狀態,隨時等待接受新的任務。
線程和RunLoop之間是一一對應的,其關系是保存在一個全局的Dictionary里。線程剛創建時并沒有RunLoop,如果你不主動獲取,它一直都不會有。runloop的創建是發生在第一次獲取的時候,銷毀時在線程結束時。你只能在一個線程的內部獲取其RunLoop(主線程除外)。
// 只有主線程的RunLoop是默認開啟的,所以程序在啟動后,會一直運行,不會退出。其他線程的RunLoop如果需要開啟就手動開啟
線程與進程的區別和聯系
1.定義
進程是具有一定獨立功能的程序關于某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位.
線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源.
2.關系
一個線程可以創建和撤銷另一個線程;同一個進程中的多個線程之間可以并發執行.
相對進程而言,線程是一個更加接近于執行體的概念,它可以與同進程中的其他線程共享數據,但擁有自己的棧空間,擁有獨立的執行序列。
3.區別
進程和線程的主要差別在于它們是不同的操作系統資源管理方式。進程有獨立的地址空間,一個進程崩潰后,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不同執行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等于整個進程死掉,所以多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。但對于一些要求同時進行并且又要共享某些變量的并發操作,只能用線程,不能用進程。
1) 簡而言之,一個程序至少有一個進程,一個進程至少有一個線程.
2) 線程的劃分尺度小于進程,使得多線程程序的并發性高。
3) 另外,進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運
行效率。
4) 線程在執行過程中與進程還是有區別的。每個獨立的線程有一個程序運行的入口、順序執行序列和
程序的出口。但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。
5) 從邏輯角度來看,多線程的意義在于一個應用程序中,有多個執行部分可以同時執行。但操作系統
并沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的
重要區別。
4.優缺點線程和進程在使用上各有優缺點:線程執行開銷小,但不利于資源的管理和保護;而進程正相反。同時,線程適合于在SMP機器上運行,而進程則可以跨機器遷移。