NSTimer循環(huán)引用踩坑紀(jì)實

在iOS開發(fā)中首頁展示廣告欄河胎,并定時驅(qū)動的展示效果很常見偷线,就目前我經(jīng)手的項目來看,多數(shù)有這種展示锋恬,這種是需要用定時器驅(qū)動的,然基本沒有人考慮到NSTimer使用造成的循環(huán)引用問題慎式,特別是對于一些需要切換框架的App伶氢,頻繁的切換框架趟径,造成頻繁的創(chuàng)建新框架,原框架由于和NSTimer相互引用無法銷毀癣防,造成內(nèi)存增長蜗巧,閑話不多說,進(jìn)入正題:

一般情況下創(chuàng)建定時器的方法:

- (NSTimer *)verifyTimer{

    if (!_verifyTimer) {//立刻執(zhí)行
        _verifyTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(verifyTimerAction:) userInfo:nil repeats:YES];
    }
    return _verifyTimer;
}
self.timer = [NSTimer timerWithTimeInterval:3.0f target:self selector:@selector(timer:) userInfo:nil repeats:YES]
//加入runloop后立即執(zhí)行
[[NSRunLoop currentRunLoop] addTimer:self.bannerTimer forMode:NSRunLoopCommonModes];

在這里不對每個參數(shù)過多介紹蕾盯,就上邊的兩種創(chuàng)建方式看幕屹,都存在循環(huán)引用的情況
一般我們在使用NSTimer時都會把它當(dāng)做一個屬性來使用,NSTimer被self引用级遭,在重復(fù)調(diào)用方法時望拖,將self作為target,這時NSTimer會獲取保留self挫鸽,此時就會造成循環(huán)引用使self和NSTimer都不能銷毀说敏,當(dāng)然我們可以在銷毀self之前使用以下兩句銷毀NSTimer

[self.verifyTimer invalidate];
self.verifyTimer = nil;

然不是所有開發(fā)者都這么注意此處的循環(huán)引用問題,廢話不多說丢郊,直接上代碼盔沫,讓我們對使用方法做一下處理

__weak __typeof(&*self)ws = self;
if (self.bannerTimer == nil) {//此處必須加判斷,若是重復(fù)創(chuàng)建加入runloop枫匾,則會同時進(jìn)行若干個timer架诞,廣告切換則會加快
self.bannerTimer = [NSTimer  block_TimerWithTimeInterval:3.0f block:^{   
       [ws nextPageAction];
} repeats:YES];
    
[[NSRunLoop currentRunLoop] addTimer:self.bannerTimer forMode:NSRunLoopCommonModes];
}

使用上述方法需要創(chuàng)建NSTimer的分類

#import <Foundation/Foundation.h>

@interface NSTimer (TimerBlockSuport)

/**
 分類解決NSTimer在使用時造成的循環(huán)引用的問題

 @param interval 間隔時間
 @param block    回調(diào)
 @param reqeats  是否立刻執(zhí)行

 @return 返回NSTimer實體
 */
+ (NSTimer *)block_TimerWithTimeInterval:(NSTimeInterval)interval block:(void(^)())block repeats:(BOOL)reqeats;

@end

#import "NSTimer+TimerBlockSuport.h"

@implementation NSTimer (TimerBlockSuport)

+ (NSTimer *)block_TimerWithTimeInterval:(NSTimeInterval)interval block:(void (^)())block repeats:(BOOL)reqeats{
    
    return [self timerWithTimeInterval:interval target:self selector:@selector(blockinvoke:) userInfo:[block copy] repeats:reqeats];
    
}

+ (void)blockinvoke:(NSTimer *)timer{

    void (^block)() = timer.userInfo;
    if (block) {
        block();
    }
    
}

上述創(chuàng)建方式我們方法的調(diào)用者是NSTImer自己,只是NSTimer捕獲了參數(shù)block干茉,若是block中也是用self調(diào)用方法的話谴忧,也會造成循環(huán)引用,我們這里將self弱引用角虫,這樣NSTimer不會捕獲self的強引用沾谓,巧妙的避開了循環(huán)引用。

小坑:

在使用時遇到一個小問題上遥,在使用定時器時搏屑,我沒有判斷屬性NSTimer是否為nil,導(dǎo)致多次對屬性NSTImer賦值粉楚,造成runloop中有多個調(diào)用同一個方法的NSTimer在跑辣恋,導(dǎo)致重復(fù)執(zhí)行時間間隔變小的問題,在這提醒一下模软,使用時切記判斷是否為nil

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末伟骨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子燃异,更是在濱河造成了極大的恐慌携狭,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件回俐,死亡現(xiàn)場離奇詭異逛腿,居然都是意外死亡稀并,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門单默,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碘举,“玉大人,你說我怎么就攤上這事搁廓∫保” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵境蜕,是天一觀的道長蝙场。 經(jīng)常有香客問我,道長粱年,這世上最難降的妖魔是什么售滤? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮逼泣,結(jié)果婚禮上趴泌,老公的妹妹穿的比我還像新娘。我一直安慰自己拉庶,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布秃励。 她就那樣靜靜地躺著氏仗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪夺鲜。 梳的紋絲不亂的頭發(fā)上皆尔,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機與錄音币励,去河邊找鬼慷蠕。 笑死,一個胖子當(dāng)著我的面吹牛食呻,可吹牛的內(nèi)容都是我干的流炕。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼仅胞,長吁一口氣:“原來是場噩夢啊……” “哼每辟!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起干旧,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤渠欺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后椎眯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挠将,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡胳岂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了舔稀。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片旦万。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖镶蹋,靈堂內(nèi)的尸體忽然破棺而出成艘,到底是詐尸還是另有隱情,我是刑警寧澤贺归,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布淆两,位于F島的核電站,受9級特大地震影響拂酣,放射性物質(zhì)發(fā)生泄漏秋冰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一婶熬、第九天 我趴在偏房一處隱蔽的房頂上張望剑勾。 院中可真熱鬧,春花似錦赵颅、人聲如沸虽另。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捂刺。三九已至,卻和暖如春募寨,著一層夾襖步出監(jiān)牢的瞬間族展,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工拔鹰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留仪缸,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓列肢,卻偏偏與公主長得像恰画,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子例书,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

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