iOS 多線程筆記_( 1 )

1、一個NSThread對象就代表一條線程

創(chuàng)建、啟動線程
NSThread *thread = [[NSThread alloc] initWithTarget:self start];selector:@selector(run) object:nil];

[thread

// 線程一啟動,就會告訴 CPU 準(zhǔn)備就緒,可以隨時接受 CPU 調(diào)度! CPU 調(diào)度當(dāng)前線程之后,就會在線程thread中執(zhí)行self的run方法

主線程相關(guān)用法

  • (NSThread *)mainThread; // 獲得主線程
  • (BOOL)isMainThread; // 是否為主線程
  • (BOOL)isMainThread; // 是否為主線程

2、獲得當(dāng)前線程

NSThread *current = [NSThread currentThread];

線程的調(diào)度優(yōu)先級

  • (double)threadPriority;
  • (BOOL)setThreadPriority:(double)p;
  • (double)threadPriority;
  • (BOOL)setThreadPriority:(double)p;
  • 調(diào)度優(yōu)先級的取值范圍是0.0 ~ 1.0,默認(rèn)0.5,值越大,優(yōu)先級越高

線程的名字

  • (void)setName:(NSString *)n;
  • (NSString *)name;

三、創(chuàng)建線程后自動啟動線程

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

隱式創(chuàng)建并啟動線程

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

上述2種創(chuàng)建線程方式的優(yōu)缺點

優(yōu)點:簡單快捷

缺點:無法對線程進行更詳細(xì)的設(shè)置

四、互斥鎖使用格式

@synchronized(鎖對象) { // 需要鎖定的代碼 }

注意:鎖定1份代碼只用1把鎖,用多把鎖是無效的

互斥鎖的優(yōu)缺點

優(yōu)點:能有效防止因多線程搶奪資源造成的數(shù)據(jù)安全問題

缺點:需要消耗大量的CPU資源

互斥鎖的使用前提:多條線程搶奪同一塊資源

相關(guān)專業(yè)術(shù)語:線程同步
線程同步的意思是:多條線程在同一條線上執(zhí)行(按順序地執(zhí)行任務(wù))
互斥鎖,就是使用了線程同步技術(shù)

五、OC在定義屬性時有nonatomic和atomic兩種選擇

  • atomic:原子屬性,為setter方法加鎖(默認(rèn)就是atomic)

    nonatomic:非原子屬性,不會為setter方法加鎖

  • nonatomic和atomic對比

    atomic:線程安全,需要消耗大量的資源

    nonatomic:非線程安全,適合內(nèi)存小的移動設(shè)備

  • iOS開發(fā)的建議

    所有屬性都聲明為nonatomic

    盡量避免多線程搶奪同一塊資源

    盡量將加鎖、資源搶奪的業(yè)務(wù)邏輯交給服務(wù)器端處理,減小移動客戶端的壓力

六、既然多線程這么爽, 線程是不是越多越好呢?

<1> 開啟線程需要消耗一定的內(nèi)存(默認(rèn)情況下,線程占用 512KB 的棧區(qū)空間);
<2> 會使應(yīng)用程序增加很多代碼!代碼變多之后,程序復(fù)雜性就會提高!
<3> CPU 在多條線程之間來回切換!線程越多, CPU就越累!

建議: 在移動應(yīng)用的開發(fā)中; 一般只開3~5條線程!

七、重點:為什么要使用橋接?你是怎么進行混合開發(fā)的?

{

    橋接 (__bridge) :C 和 OC 之間傳遞數(shù)據(jù)的時候需要使用橋接! why?為什么呢?
    
    1.內(nèi)存管理:
        在 OC 中,如果是在 ARC環(huán)境下開發(fā),編譯器在編譯的時候會根據(jù)代碼結(jié)構(gòu),自動為 OC 代碼添加 retain/release/autorelease等.   ----->自動內(nèi)存管理(ARC)的原理!
    
        但是, ARC只負(fù)責(zé) OC 部分的內(nèi)存管理!不會負(fù)責(zé) C 語言部分代碼的內(nèi)存管理!
        也就是說!即使是在 ARC 的開發(fā)環(huán)境中!如果使用的 C 語言代碼出現(xiàn)了 retain/copy/new/create等字樣呢!我們都需要手動為其添加 release 操作!否則會出現(xiàn)內(nèi)存泄露!
    
        在混合開發(fā)時(C 和 OC 代碼混合),C 和 OC 之間傳遞數(shù)據(jù)需要使用 __bridge 橋接,目的就是為了告訴編譯器如何管理內(nèi)存

        在 MRC中不需要使用橋接! 因為都需要手動進行內(nèi)存管理!
    
    2.數(shù)據(jù)類型轉(zhuǎn)換:
    
        Foundation 和 Core Foundation框架的數(shù)據(jù)類型可以互相轉(zhuǎn)換的
        Foundation :  OC
        Core Foundation : C語言
    
        NSString *str = @"123"; // Foundation
        CFStringRef str2 = (__bridge CFStringRef)str; // Core Foundation
        NSString *str3 = (__bridge NSString *)str2;
            CFArrayRef ---- NSArray
            CFDictionaryRef ---- NSDictionary
            CFNumberRef ---- NSNumber

        Core Foundation中手動創(chuàng)建的數(shù)據(jù)類型,都需要手動釋放

        CGPathRef path = CGPathCreateMutable();
        CGPathRetain(path);

        CGPathRelease(path);
        CGPathRelease(path);

    3.橋接的添加:
        利用 Xcode 提示自動添加! --簡單/方便/快速
    /**
     凡是函數(shù)名中帶有create\copy\new\retain等字眼, 都應(yīng)該在不需要使用這個數(shù)據(jù)的時候進行release
     GCD的數(shù)據(jù)類型在ARC環(huán)境下不需要再做release
     CF(Core Foundation)的數(shù)據(jù)類型在ARC\MRC環(huán)境下都需要再做release
    */    
        
}

八、iOS中多線程實現(xiàn)方案2.NSThread - 1基本使用

重點:1.三種創(chuàng)建線程! 2.常用方法!
{
    1.NSThread: 一個 NSThread 就代表一個線程對象!
    // OC語言 / 使用面向?qū)ο?/ 需要手動管理線程生命周期(創(chuàng)建/銷毀等)
    
    2.三種多線程實現(xiàn)方案:
    
    1> 先創(chuàng)建,后啟動
    // 創(chuàng)建
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(download:) object:nil];
    // 啟動
    [thread start];
    
    2> 創(chuàng)建完自動啟動
    [NSThread detachNewThreadSelector:@selector(download:) toTarget:self withObject:nil];
    
    3> 隱式創(chuàng)建(自動啟動)
    [self performSelectorInBackground:@selector(download:) withObject:nil];
    
    3.常用方法:
     名字/獲得主線程/獲得當(dāng)前線程/阻塞線程/退出線程
    // 不常用: 棧區(qū)大小/優(yōu)先級
    1> 獲得當(dāng)前線程
    + (NSThread *)currentThread;
    
    2> 獲得主線程
    + (NSThread *)mainThread;
    
    3> 睡眠(暫停)線程
    + (void)sleepUntilDate:(NSDate *)date;
    + (void)sleepForTimeInterval:(NSTimeInterval)ti;
    
    4> 設(shè)置線程的名字
    - (void)setName:(NSString *)n;
    - (NSString *)name;
}

九、重點:1.線程同步技術(shù)! 2.理解資源共享

{
    當(dāng)多條線程訪問同一塊資源的時候,就會出現(xiàn)數(shù)據(jù)錯亂和數(shù)據(jù)安全的問題!
    
    1.ATM機取錢; 賣票;
    
    2.解決方案:互斥鎖 @synchronized(鎖對象self){  /*需要鎖住的代碼,越少越好!*/ }   ------- 廁所加鎖!
    
    注意:鎖定一份代碼只用一把鎖,用多把鎖是無效的!
    
    優(yōu)點:能有效防止因多線程搶奪資源而引起的數(shù)據(jù)安全問題!
    缺點:需要消耗大量的CPU資源!
    
    結(jié)論:盡量少加鎖!互斥鎖的使用前提是多條線程搶奪同一塊資源!
    
    3.添加互斥鎖技巧: [[NSUserDefaults standardUserDefaults] synchronize];
    
    4.線程同步技術(shù):  ----- 互斥鎖使用了線程同步技術(shù)!
    
    多條線程在同一條線上按順序執(zhí)行任務(wù)!
    
    5.線程安全:保證多條線程進行讀寫操作,都能夠得到正確的結(jié)果!
    
    用 '鎖' 來實現(xiàn)線程安全!
}

十、為什么要在主線程更新UI?

因為UIKit 框架都不是線程安全的!為了得到更好的用戶體驗,UIKit框架犧牲了線程安全;

所以我們要在主線程更新UI;

十一、下載圖片 更新 UI

/*------------------------- iOS中多線程實現(xiàn)方案2.NSThread - 4線程間通信 -------------------------*/
1.下載圖片? 更新 UI?
{
    1.后臺線程(子線程)下載圖片;
    
    [self performSelectorInBackground:@selector(downloadImage) withObject:nil];
    
    2.主線程更新 UI.
    
    線程間通信常用方法:
    
    // 最后一個參數(shù):是否等待調(diào)用方法執(zhí)行結(jié)束!
    <1>[self performSelectorOnMainThread:@selector(setImageWithImage:) withObject:nil waitUntilDone:YES];
    
    <2>[self performSelector:@selector(setImageWithImage:) onThread:[NSThread mainThread] withObject:nil waitUntilDone:YES];
}

十二、線程狀態(tài)

線程狀態(tài).png

十三、cell下載圖片思路

cell下載圖片思路 – 無沙盒緩存.png
cell下載圖片思路 – 有沙盒緩存.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,182評論 6 543
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,489評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,290評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,776評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,510評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,866評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,860評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,036評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,585評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,331評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,536評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,058評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,754評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,154評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,469評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,273評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,505評論 2 379

推薦閱讀更多精彩內(nèi)容

  • 一、多線程基礎(chǔ) 基本概念 進程進程是指在系統(tǒng)中正在運行的一個應(yīng)用程序每個進程之間是獨立的,每個進程均運行在其專用且...
    AlanGe閱讀 555評論 0 0
  • 多線程基本概念 單核CPU,同一時間cpu只能處理1個線程,只有1個線程在執(zhí)行 。多線程同時執(zhí)行:是CPU快速的在...
    WeiHing閱讀 718評論 1 5
  • .一.進程 進程:是指在系統(tǒng)中正在運行的一個應(yīng)用程序,每個進程之間是獨立的,每個進程均運行在其專用且受保護的內(nèi)存空...
    IIronMan閱讀 4,510評論 1 33
  • 張大爺今年70多歲了。家住長春寬城區(qū)。長春不是70歲以上老人坐公交車免費么。張大爺天天坐車溜達(dá)。 張大爺身板硬朗沒...
    春韻留芳閱讀 735評論 2 1
  • 玩弄我很有意思是嗎?! 他猩紅著雙眼,揪著她的領(lǐng)子,憤怒的質(zhì)問著,纖弱的身軀在那件很大的衣服中顯得...
    千色sai閱讀 230評論 1 1