多線程下關(guān)于NSTimer不釋放的問(wèn)題

多線程下關(guān)于NSTimer不釋放的問(wèn)題

前言

前段時(shí)間由于項(xiàng)目需要,用到NSTimer渗饮,考慮到不占用主線程資源但汞,故把timer放在子線程運(yùn)行。前幾天發(fā)現(xiàn)該controller pop之后并沒(méi)有釋放互站,問(wèn)題定位到NSTimer這里私蕾。經(jīng)過(guò)測(cè)試發(fā)現(xiàn)NSTimer在多線程下不釋放的問(wèn)題,但是找不到原因胡桃。由于工作關(guān)系踩叭,未能繼續(xù)進(jìn)行問(wèn)題定位追蹤,所以先記錄下來(lái)翠胰。若有同行看到并且有答案容贝,望賜教。

正文

使用子線程創(chuàng)建NSTimer

代碼:


- (void)createThread {

    self.thread = [[NSThread alloc] initWithTarget:self selector:@selector(createTimer) object:nil];

    [self.thread start];

}


- (void)createTimer

{

    NSTimer *t = [NSTimer scheduledTimerWithTimeInterval:1.f target:self selector:@selector(repeat) userInfo:nil repeats:YES];

    self.timer = t;

    [[NSRunLoop currentRunLoop] run];

}


- (void)repeat

{

    NSLog(@"repeat --- ");

}


- (void)stopTimer

{

    [self.timer invalidate];

    self.timer = nil;

}

解開引用循環(huán)仍無(wú)法正常釋放

如上代碼之景,這里會(huì)循環(huán)引用斤富,

self-->timer;

timer-->self锻狗;

self-->thread满力;

thread(RunLoop)-->timer焕参。

理論上,在pop controller前調(diào)用- (void)stopTimer油额,self.timer會(huì)調(diào)用-(void)invalidate方法是的Timer對(duì)self的強(qiáng)引用解除叠纷,thread(RunLoop)對(duì)timer的強(qiáng)引用解除(詳見(jiàn)invalidate的文檔描述)。但是實(shí)際測(cè)試發(fā)現(xiàn)潦嘶,調(diào)用- (void)stopTimer后雖然timer停止了涩嚣,但是pop controller后,controller并沒(méi)有釋放衬以。

在同一子線程執(zhí)行- (void)stopTimer

查閱了一些資料缓艳,有這么一個(gè)說(shuō)法:需在timer運(yùn)行的線程下執(zhí)行-(void)invalidate才有效果。抱著懷疑的態(tài)度(因?yàn)閷?shí)際上看峻,像上面的代碼一樣,在主線程調(diào)用衙吩,一樣能使timer停止)在同一線程執(zhí)行-(void)invalidate互妓,如下代碼:


[self performSelector:@selector(stopTimer) onThread:self.thread withObject:nil waitUntilDone:YES];

結(jié)果依舊是沒(méi)有釋放。

在timer的repeat中執(zhí)行- (void)stopTimer

我也不知道為什么會(huì)做這樣的嘗試坤塞,或許是程序員的直覺(jué)吧冯勉。

于是在repeat中添加如下代碼:


- (void)repeat

{

    static int i = 0;

    NSLog(@"repeat --- ");

    i++;

    if (i >=2) {

        [self.timer invalidate];

    }

}

這一試,我更凌亂了摹芙,controller能夠正常釋放灼狰。因?yàn)楹蜕厦鎳L試是一樣在同一線程執(zhí)行-(void)invalidate的,但這樣controller能夠正常釋放浮禾。反復(fù)思量交胚,我找不出兩者的區(qū)別在哪里,所以我很凌亂盈电。

結(jié)語(yǔ)

我并沒(méi)有解決這個(gè)問(wèn)題蝴簇,在這里只是提出了一個(gè)問(wèn)題,并且做了一些思考和嘗試匆帚,可能是自己知識(shí)還有所欠缺熬词,之后會(huì)找時(shí)間再去研究一下這個(gè)問(wèn)題。

看到這里的你或許有答案吸重,望賜教互拾。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市嚎幸,隨后出現(xiàn)的幾起案子颜矿,更是在濱河造成了極大的恐慌,老刑警劉巖鞭铆,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件或衡,死亡現(xiàn)場(chǎng)離奇詭異焦影,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)封断,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門斯辰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人坡疼,你說(shuō)我怎么就攤上這事彬呻。” “怎么了柄瑰?”我有些...
    開封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵闸氮,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我教沾,道長(zhǎng)蒲跨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任授翻,我火速辦了婚禮或悲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘堪唐。我一直安慰自己巡语,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開白布淮菠。 她就那樣靜靜地躺著男公,像睡著了一般。 火紅的嫁衣襯著肌膚如雪合陵。 梳的紋絲不亂的頭發(fā)上枢赔,一...
    開封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音曙寡,去河邊找鬼糠爬。 笑死,一個(gè)胖子當(dāng)著我的面吹牛举庶,可吹牛的內(nèi)容都是我干的执隧。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼户侥,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼镀琉!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起蕊唐,我...
    開封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤屋摔,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后替梨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钓试,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡装黑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了弓熏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恋谭。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖挽鞠,靈堂內(nèi)的尸體忽然破棺而出疚颊,到底是詐尸還是另有隱情,我是刑警寧澤信认,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布材义,位于F島的核電站,受9級(jí)特大地震影響嫁赏,放射性物質(zhì)發(fā)生泄漏其掂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一潦蝇、第九天 我趴在偏房一處隱蔽的房頂上張望清寇。 院中可真熱鬧,春花似錦护蝶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至负饲,卻和暖如春堤魁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背返十。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工妥泉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人洞坑。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓盲链,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親迟杂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子刽沾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

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

  • 之前要做一個(gè)發(fā)送短信驗(yàn)證碼的倒計(jì)時(shí)功能,打算用NSTimer來(lái)實(shí)現(xiàn)排拷,做的過(guò)程中發(fā)現(xiàn)坑還是有不少的侧漓。 基本使用 NS...
    WeiHing閱讀 4,378評(píng)論 1 8
  • 一、什么是NSTimer 官方給出解釋是“A timer provides a way to perform a ...
    行走的菜譜閱讀 1,143評(píng)論 0 4
  • 1.設(shè)計(jì)模式是什么监氢? 你知道哪些設(shè)計(jì)模式布蔗,并簡(jiǎn)要敘述藤违? 設(shè)計(jì)模式是一種編碼經(jīng)驗(yàn),就是用比較成熟的邏輯去處理某一種類...
    司馬DE晴空閱讀 1,283評(píng)論 0 7
  • 面試中纵揍,經(jīng)常會(huì)問(wèn)道 NSTimer 循環(huán)引用的問(wèn)題顿乒。閑話少敘。下面來(lái)講講 NSTimer 為什么會(huì)造成循環(huán)引用骡男? ...
    人話博客閱讀 1,287評(píng)論 0 53
  • 晚上邵石明借口創(chuàng)作淆游,也不做飯,因此兩人經(jīng)常吃方便面隔盛,趙晶晶提議出去吃飯犹菱,他不同意。趙晶晶明白他的意思吮炕,不上他的當(dāng)腊脱,...
    逍凡閱讀 276評(píng)論 1 3