IOS 多线程原理
iPhone中的線程應用并不是無節制的,官方給出的資料顯示iPhone OS下的主線程的堆棧大小是1M,第二個線程開始都是512KB。并且該值不能通過編譯器開關或線程API函數來更改。只有主線程有直接修改UI的能力。
一.線程概述
- 一個運行著的程序就是一個進程或者叫做一個任務,一個進程至少包含一個線程,線程就是程序的執行流。
- Mac和iOS中的程序啟動,創建好一個進程的同時, 一個線程便開始運行,這個線程叫主線程。
- 主線程在程序中的地位和其他線程不同,它是其他線程最終的父線程,且所有界面的顯示操作即AppKit或 UIKit的操作必須在主線程進行。
- 系統中的每一個進程都有自己獨立的虛擬內存空間,而同一個進程中的多個線程則共用進程的內存空間。
- 每創建一個新的線程,都需要一些內存(如每個線程有自己的Stack空間)和消耗一定的CPU時間。
- 另外當多個線程對同一個資源出現爭奪的時候需要注意線程安全問題。
二.創建線程
創建一個新的線程就是給進程增加了一個執行流,執行流總得有要執行的代碼吧,所以新建一個線程需要提供一個函數或者方法作為線程的入口。1.使用NSThread
- NSThread提供了創建線程的途徑,還可以提供了檢測當前線程是否是主線程的方法。 使用NSThread創建一個新的線程有兩種方式:
- 1.創建一個NSThread的對象,調用其start方法。對于這種方式的NSThread對象的創建,可以使用一個目標對象的方法初始化一個NSThread對象,或者創建一個繼承NSThread類的子類,實現其main方法,然后在直接創建這個子類的對象。
- 2.使用 detachNewThreadSelector:toTarget:withObject:這個類方法創建一個線程,這個比較直接了,直接使用目標對象的方法作為線程啟動入口。
- NSThread提供了創建線程的途徑,還可以提供了檢測當前線程是否是主線程的方法。 使用NSThread創建一個新的線程有兩種方式:
2.使用NSObject
- 其實NSObject直接就加入了多線程的支持,允許對象的某個方法在后臺運行。如:
[myObj performSelectorInBackground:@selector(doSomething) withObject:nil];
- 其實NSObject直接就加入了多線程的支持,允許對象的某個方法在后臺運行。如:
- 3.POSIX Thread
- 由于Mac和iOS都是基于Darwin系統,Darwin系統的XUN內核,是基于Mach和BSD的,繼承了BSD的POSIX接口,所以可以直接使用POSIX線程的相關接口來使用線程。
- 創建線程的接口為 pthread_create,當然在創建之前可以通過相關函數設置好線程的屬性。以下為POSIX線程使用簡單的例子。
三.多線程進階
NSOperation&NSOperationQueue
很多時候我們使用多線程,需要控制線程的并發數,畢竟線程也是消耗系統資源的,當程序中同時運行的線程過多時,系統必然變慢。 所以很多時候我們會控制同時運行線程的數目。
NSOperation可以封裝我們的操作,然后將創建好的NSOperation對象放到NSOperationQueue中,OperationQueue便開始啟動新的線程去執行隊列中的操作,OperationQueue的并發度是可以通過如下方式進行設置:
- (void)setMaxConcurrentOperationCount:(NSInteger)count
總結
- 上一篇: 鲜为人知且未充分利用的 CSS 功能
- 下一篇: 软件开发—重构