iOS 多線程筆記_( 1 )

1祭往、一個(gè)NSThread對(duì)象就代表一條線程

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

[thread

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

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

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

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

NSThread *current = [NSThread currentThread];

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

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

線程的名字

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

三碘橘、創(chuàng)建線程后自動(dòng)啟動(dòng)線程

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

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

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

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

優(yōu)點(diǎn):簡(jiǎn)單快捷

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

四、互斥鎖使用格式

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

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

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

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

缺點(diǎn):需要消耗大量的CPU資源

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

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

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

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

    nonatomic:非原子屬性识颊,不會(huì)為setter方法加鎖

  • nonatomic和atomic對(duì)比

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

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

  • iOS開發(fā)的建議

    所有屬性都聲明為nonatomic

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

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

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

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

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

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

{

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

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

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

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

        CGPathRelease(path);
        CGPathRelease(path);

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

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

重點(diǎn):1.三種創(chuàng)建線程! 2.常用方法!
{
    1.NSThread: 一個(gè) NSThread 就代表一個(gè)線程對(duì)象!
    // OC語(yǔ)言 / 使用面向?qū)ο?/ 需要手動(dòng)管理線程生命周期(創(chuàng)建/銷毀等)
    
    2.三種多線程實(shí)現(xiàn)方案:
    
    1> 先創(chuàng)建陶舞,后啟動(dòng)
    // 創(chuàng)建
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(download:) object:nil];
    // 啟動(dòng)
    [thread start];
    
    2> 創(chuàng)建完自動(dòng)啟動(dòng)
    [NSThread detachNewThreadSelector:@selector(download:) toTarget:self withObject:nil];
    
    3> 隱式創(chuàng)建(自動(dòng)啟動(dòng))
    [self performSelectorInBackground:@selector(download:) withObject:nil];
    
    3.常用方法:
     名字/獲得主線程/獲得當(dāng)前線程/阻塞線程/退出線程
    // 不常用: 棧區(qū)大小/優(yōu)先級(jí)
    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;
}

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

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

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

因?yàn)閁IKit 框架都不是線程安全的!為了得到更好的用戶體驗(yàn),UIKit框架犧牲了線程安全;

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

十一菩佑、下載圖片 更新 UI

/*------------------------- iOS中多線程實(shí)現(xiàn)方案2.NSThread - 4線程間通信 -------------------------*/
1.下載圖片? 更新 UI?
{
    1.后臺(tái)線程(子線程)下載圖片;
    
    [self performSelectorInBackground:@selector(downloadImage) withObject:nil];
    
    2.主線程更新 UI.
    
    線程間通信常用方法:
    
    // 最后一個(gè)參數(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)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末同仆,一起剝皮案震驚了整個(gè)濱河市裙品,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌岁忘,老刑警劉巖区匠,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異麻汰,居然都是意外死亡戚篙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門岔擂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來位喂,“玉大人,你說我怎么就攤上這事忆某±龋” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵聋呢,是天一觀的道長(zhǎng)颠区。 經(jīng)常有香客問我,道長(zhǎng)毕莱,這世上最難降的妖魔是什么颅夺? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任吧黄,我火速辦了婚禮唆姐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘奉芦。我一直安慰自己,他們只是感情好声功,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布先巴。 她就那樣靜靜地躺著,像睡著了一般筹裕。 火紅的嫁衣襯著肌膚如雪窄驹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天抗斤,我揣著相機(jī)與錄音丈咐,去河邊找鬼。 笑死棵逊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的徒像。 我是一名探鬼主播蛙讥,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼旁涤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起劈愚,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤造虎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后算凿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡婚夫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年署鸡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片时捌。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡炉抒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出焰薄,到底是詐尸還是另有隱情,我是刑警寧澤亩码,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布野瘦,位于F島的核電站,受9級(jí)特大地震影響缅刽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜迟蜜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一啡省、第九天 我趴在偏房一處隱蔽的房頂上張望髓霞。 院中可真熱鬧畦戒,春花似錦、人聲如沸障斋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)遂庄。三九已至,卻和暖如春涛目,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背估蹄。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工沫换, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人苗沧。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓待逞,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親识樱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子震束,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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

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