面試題:iOS線程保活

簡(jiǎn)介
大家好月而!我是Tony,一個(gè)熱愛(ài)技術(shù)汗洒,希望運(yùn)用技術(shù)改變生活的的追夢(mèng)男孩。閑話不多說(shuō)父款,今天聊聊iOS的線程币绨活。主要內(nèi)容如下:

線程焙┰埽活的運(yùn)用
線程笔郎保活的方法
保活的線程如何回收
線程迸ǘ瘢活運(yùn)用
在實(shí)際開(kāi)發(fā)中經(jīng)常會(huì)遇到一些耗時(shí)玫坛,且需要頻繁處理的工作,這部分工作與UI無(wú)關(guān)包晰,比如說(shuō)大文件的下載湿镀,后臺(tái)間隔一段時(shí)間進(jìn)行數(shù)據(jù)的上報(bào),APM中開(kāi)啟一個(gè)watch dog線程等伐憾。

線程泵愠眨活的方法
我們都知道運(yùn)用啟動(dòng)后,后開(kāi)啟一個(gè)主線程树肃,這個(gè)線程一直監(jiān)聽(tīng)這各種事件源蒸矛,這個(gè)監(jiān)聽(tīng)器就是RunLoop.對(duì)于RunLoop的原理分析,大家可以閱讀我的另一篇文章胸嘴,這里就不做具體的描述雏掠。

自定義線程
這個(gè)我創(chuàng)建了一個(gè)TYThread,內(nèi)容如下:

import "TYThread.h"

@implementation TYThread

  • (void)dealloc {
    NSLog(@"%s",func);
    }
    @end
    僅重寫(xiě)了dealloc方法,下面是具體的測(cè)試代碼

MJThread *thread = [[MJThread alloc] initWithTarget:self selector:@selector(run) object:nil];
[thread start];
//run方法

  • (void)run {
    @autoreleasepool {
    for (int i = 0; i < 100; i++) {
    NSLog(@"----子線程任務(wù) %ld",(long)i);
    }
    NSLog(@"%@----子線程任務(wù)結(jié)束",[NSThread currentThread]);
    }
    }
    run方法執(zhí)行完畢后劣像,TYThread的dealloc方法也執(zhí)行了乡话,說(shuō)明一般情況下開(kāi)啟線程任務(wù)后,當(dāng)任務(wù)執(zhí)行完畢后耳奕,線程就會(huì)被銷(xiāo)毀绑青,如果想讓線程不死掉的話诬像,需要為線程添加一個(gè)RunLoop,具體代碼如下:

  • (void)run {
    @autoreleasepool {
    for (int i = 0; i < 100; i++) {
    NSLog(@"----子線程任務(wù) %ld",(long)i);
    }
    NSLog(@"%@----子線程任務(wù)結(jié)束",[NSThread currentThread]);
    NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
    // 往RunLoop里面添加Source\Timer\Observer,Port相關(guān)的是Source1事件
    //添加了一個(gè)Source1闸婴,但是這個(gè)Source1也沒(méi)啥事坏挠,所以線程在這里就休眠了,不會(huì)往下走邪乍,----end----一直不會(huì)打印
    [runLoop addPort:[NSMachPort port] forMode:NSRunLoopCommonModes];
    [runLoop run];
    NSLog(@"%s ----end----", func);
    }
    }
    通過(guò)打印發(fā)現(xiàn)降狠,線程的dealloc方法不會(huì)執(zhí)行,NSLog(@"%s ----end----", func);也不會(huì)執(zhí)行溺欧。下面通過(guò)performSelector方法喊熟,往線程中添加任務(wù)

  • (IBAction)start:(id)sender {
    [self performSelector:@selector(doSomethingInSubThread) onThread:self.thread withObject:nil waitUntilDone:NO];
    //waitUntilDone:YES 等到子線程任務(wù)執(zhí)行完再執(zhí)行下面NSLog
    //NO 不用等到子線程執(zhí)行完再執(zhí)行下面NSLog(下面NSLog在主線程,test在子線程姐刁,同時(shí)執(zhí)行)
    NSLog(@"123");
    }
    任務(wù)可以正常執(zhí)行芥牌,說(shuō)明線程一直是活著的。

蹦羰梗活的線程如何回收
添加stop的執(zhí)行方法如下:

  • (IBAction)stop:(id)sender {
    [self performSelector:@selector(quitRunLoop) onThread:self.thread withObject:nil waitUntilDone:NO];
    }
    解決循環(huán)引用問(wèn)題

//如果使用如下方式創(chuàng)建thread壁拉,self會(huì)引用thread,thread會(huì)引用self柏靶,會(huì)造成循環(huán)引用弃理。
TYThread *thread = [[TYThread alloc] initWithTarget:self selector:@selector(run) object:nil];
//需要在quitRunLoop中,進(jìn)行如下設(shè)置

  • (void)quitRunLoop {
    // 設(shè)置標(biāo)記為NO
    self.stopped = YES;
    // 停止RunLoop
    CFRunLoopStop(CFRunLoopGetCurrent());
    [self.thread cancel];
    //解決循環(huán)引用問(wèn)題
    self.thread = nil;
    NSLog(@"%s %@", func, [NSThread currentThread]);
    }
    這樣就能釋放掉線程

作者:tonytong
鏈接:http://www.reibang.com/p/adf8bdd62487
來(lái)源:簡(jiǎn)書(shū)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末屎蜓,一起剝皮案震驚了整個(gè)濱河市痘昌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌炬转,老刑警劉巖辆苔,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異扼劈,居然都是意外死亡驻啤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)荐吵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)骑冗,“玉大人,你說(shuō)我怎么就攤上這事先煎≡羯” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵薯蝎,是天一觀的道長(zhǎng)遥倦。 經(jīng)常有香客問(wèn)我,道長(zhǎng)良风,這世上最難降的妖魔是什么谊迄? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮烟央,結(jié)果婚禮上统诺,老公的妹妹穿的比我還像新娘。我一直安慰自己疑俭,他們只是感情好粮呢,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著钞艇,像睡著了一般啄寡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上哩照,一...
    開(kāi)封第一講書(shū)人閱讀 52,736評(píng)論 1 312
  • 那天挺物,我揣著相機(jī)與錄音,去河邊找鬼飘弧。 笑死识藤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的次伶。 我是一名探鬼主播痴昧,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼冠王!你這毒婦竟也來(lái)了赶撰?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤柱彻,失蹤者是張志新(化名)和其女友劉穎豪娜,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體绒疗,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡侵歇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吓蘑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惕虑。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖磨镶,靈堂內(nèi)的尸體忽然破棺而出溃蔫,到底是詐尸還是另有隱情,我是刑警寧澤琳猫,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布伟叛,位于F島的核電站,受9級(jí)特大地震影響脐嫂,放射性物質(zhì)發(fā)生泄漏统刮。R本人自食惡果不足惜紊遵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望侥蒙。 院中可真熱鬧暗膜,春花似錦、人聲如沸鞭衩。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)论衍。三九已至瑞佩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間坯台,已是汗流浹背炬丸。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捂人,地道東北人御雕。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像滥搭,于是被迫代替她去往敵國(guó)和親酸纲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

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

  • iOS-RunLoop詳解(三):使用RunLoop線程保活方案 如果經(jīng)常要在子線程中做事情愁溜,不使用奔残幔活,就會(huì)一直...
    蔣斌文閱讀 1,148評(píng)論 0 7
  • 授權(quán)轉(zhuǎn)載,作者:bestswifter 在討論 runloop 相關(guān)的文章渐扮,以及分析 AFNetworking(2...
    北辰青閱讀 851評(píng)論 0 2
  • 如果經(jīng)常要在子線程中做事情墓律,不使用卑蚬溃活,就會(huì)一直創(chuàng)建耻讽、銷(xiāo)毀子線程察纯,這樣很耗性能的,所以經(jīng)常在子線程做事情最好使用線...
    Imkata閱讀 1,786評(píng)論 0 5
  • 1香伴、線程保活管理類(lèi).h文件 // // ZFPermenantThread.h // ZFThread // //...
    無(wú)名指的情懷閱讀 408評(píng)論 0 0
  • 在開(kāi)發(fā)場(chǎng)景中,有可能需要對(duì)某條線程毕缤荩活,讓這條線程在有事情做的時(shí)候進(jìn)行工作匕坯,沒(méi)有事情做的時(shí)候進(jìn)行休眠束昵。 技術(shù)點(diǎn) N...
    CoderGuogt閱讀 342評(píng)論 1 1