iOS --- 多線程之NSThread

NSThread是iOS中底層的線程類,相比GCD和NSOperation更加輕量級(jí),也提供了更為靈活的使用方式,可更直觀地控制線程對(duì)象,但需要管理線程的生命周期、同步、加鎖等問(wèn)題,會(huì)導(dǎo)致一定的性能開銷。
NSThread的精確度比GCD高,可取消該線程執(zhí)行,并且可自定義線程。

創(chuàng)建線程

動(dòng)態(tài)方法

NSThread *aThread = [[NSThread alloc] initWithTarget:self selector:@selector(runThread) object:nil];
aThread.threadPriority = 1; // [0.0~1.0],1.0為最高優(yōu)先級(jí)
[aThread start];
[aThread main]; // thread body method [aThread cancel];

靜態(tài)方法

[NSThread detachNewThreadSelector:@selector(runThread) toTarget:self withObject:nil];

該方法會(huì)立即創(chuàng)建并啟動(dòng)新線程

隱式創(chuàng)建線程

[self performSelectorInBackground:@selector(runThread) withObject:nil];

其他屬性和操作

[NSThread mainThread];
[NSThread currentThread];
[self performSelector:@selector(runThread) withObject:nil]; // 在當(dāng)前線程執(zhí)行操作
[self performSelectorOnMainThread:@selector(runThread) withObject:nil waitUntilDone:YES]; // 在主線程執(zhí)行操作
[self performSelector:@selector(runThread) onThread:thread withObject:nil waitUntilDone:YES]; // 在指定線程上執(zhí)行操作

performSelector

注意:performSelector相關(guān)方法會(huì)創(chuàng)建一個(gè)timer到當(dāng)前線程或指定線程的runloop中,若當(dāng)前線程沒(méi)有runloop,則該performSelector方法會(huì)失效。
因主線程有默認(rèn)的runloop,所以在主線程中執(zhí)行performSelector,則從不會(huì)失效。所以在異步線程中要稍微注意。
不過(guò),performSelector方法在Swift中已棄用,因其在ARC下不安全。
原因在于:ARC為了確保參數(shù)在方法運(yùn)行期間的存在,會(huì)將輸入?yún)?shù)在方法開始時(shí)先進(jìn)行retain,在最后release,而performSelector并沒(méi)有機(jī)會(huì)為被調(diào)用的selector方法指定參數(shù),所以被調(diào)用的selector方法的輸入?yún)?shù)可能會(huì)指向未知的內(nèi)存地址,導(dǎo)致crash。

線程鎖

NSCondition是鎖對(duì)象,可用于保護(hù)當(dāng)前訪問(wèn)的資源。

NSCondition *lock = [[NSCondition alloc] init];
[lock lock];
// 線程中執(zhí)行操作
[lock unLock];

自定義線程

NSThread可以做到自定義線程,如下的Swift代碼,定義了CSThread類,繼承自NSThread。
添加delegate屬性,并重寫其main()方法,在其中即可指定線程內(nèi)執(zhí)行的任務(wù).

import UIKit
protocol CSThreadCompletionDelegate { 
    func csThreadCompletion()
}
class CSThread: NSThread { 
    var delegate: CSThreadCompletionDelegate!  

    override func main() { 
        super.main()  
        sleep(2) 
        dispatch_async(dispatch_get_main_queue(), { () -> Void in 
                if (self.delegate != nil) { 
                        self.delegate.csThreadCompletion() 
                } 
        }) 
    }
}

使用如下,

let csThread = CSThread()
csThread.delegate = selfcsThread.start()

// MARK: - CSThreadCompletionDelegate
func csThreadCompletion() { 
        print("csThreadCompletion")
}

DemoDemo地址

DemoMultiThread

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、簡(jiǎn)介:1.1 iOS有三種多線程編程的技術(shù),分別是:1.、NSThread2、Cocoa NSOperatio...
    LuckTime閱讀 1,452評(píng)論 0 1
  • iOS多線程開發(fā)基礎(chǔ)概念 進(jìn)程 VS 線程 進(jìn)程:程序的一次執(zhí)行,是正在執(zhí)行的程序的實(shí)例,它是Unix的一個(gè)基本概...
    qingmarch閱讀 443評(píng)論 0 1
  • 基本概念 進(jìn)程: 一個(gè)具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合的一次運(yùn)行活動(dòng)??梢岳斫獬梢粋€(gè)運(yùn)行中的應(yīng)用程序。線程:...
    charlotte2018閱讀 562評(píng)論 0 4
  • NSThread 特點(diǎn):更加面向?qū)ο蠛?jiǎn)單易用,可直接操作線程對(duì)象使用語(yǔ)言:OC語(yǔ)言使用頻率:偶爾使用線程生命周期:...
    BWLi420閱讀 611評(píng)論 0 1
  • 0. 前言 NSThread 是 iOS 多線程當(dāng)中最基礎(chǔ)最輕量的多線程技術(shù),但是需要自行管理線程的生命周期和同步...
    24小時(shí)營(yíng)業(yè)閱讀 1,327評(píng)論 0 0

友情鏈接更多精彩內(nèi)容