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