iOS開發(fā)-NSTimer的使用藝術(shù)

開始前咱們先知道NSTimer是用來的干嘛的。

 A timer waits until a certain time interval has elapsed and then fires, 
sending a specified message to a target object.

從這里我們可以看出來监嗜,NSTimer就是我為了過一段時(shí)間想目標(biāo)發(fā)送一個(gè)消息毕泌,從而執(zhí)行一系列的操作。既然我們已經(jīng)知道用法纯趋。所以咱們先來個(gè)最簡(jiǎn)單的用法

[NSTimer scheduledTimerWithTimeInterval:1.5 target:self selector:@selector(run:) userInfo:nil repeats:YES];

方法實(shí)現(xiàn)里直接打印helloworld就好憎兽,這里我就不再占用篇幅去寫了。自己去補(bǔ)就好吵冒。上面這個(gè)函數(shù)的意思就是每隔1.5秒執(zhí)行一次run方法纯命。注意:如果repeats參數(shù)為NO時(shí),只會(huì)執(zhí)行一遍該方法痹栖。
接下來我們看看怎樣控制定時(shí)器的開關(guān)

[_timer setFireDate:[NSDate distantFuture]];

調(diào)用上面語句亿汞,定時(shí)器就會(huì)關(guān)閉

[_timer setFireDate:[NSDate distantPast]];

上面就是開啟定時(shí)器
關(guān)于NSTimer也不能說的太深,因?yàn)闋可娴揭恍﹔unloop的知識(shí)揪阿。大家有興趣的可以去研究一下疗我。我也做過這方面的研究咆畏,只可惜研究尚欠,難等大雅之堂吴裤,今天就不跟大家分享旧找,等我研究的小有成就的時(shí)候。在跟大家分享嚼摩。
今天我在做AVPlayer的自定義過程中有要用到定時(shí)器,其中就涉及到runloop矿瘦,今天我跟新博文不為談runloop的底層實(shí)現(xiàn)枕面,只為談涉及到NSTimer一些bug的解決方案;
問題假設(shè)缚去,我們需要程序定時(shí)做一件事潮秘,這個(gè)時(shí)候我們創(chuàng)建NSTimer

_timer = [NSTimer timerWithTimeInterval:1.5 target:self selector:@selector(nslog) userInfo:nil repeats:YES];

細(xì)心的同學(xué)會(huì)發(fā)現(xiàn),這個(gè)NSTimer不會(huì)被執(zhí)行易结,即使我們調(diào)用上面的開啟方法枕荞,也不會(huì)執(zhí)行。下面跟大家簡(jiǎn)單談一下NSTimer的底層實(shí)現(xiàn)搞动。
當(dāng)我們創(chuàng)建NSTimer后躏精,只有將NSTimer放到一個(gè)事件循環(huán)鏈(eventloop)中,NSTimer才能一直執(zhí)行下去鹦肿,iOS中我們實(shí)現(xiàn)的方法就是放到runloop中矗烛。所以我們想要讓上面創(chuàng)建的NSTimer執(zhí)行,我們就必須將NSTimer放到一個(gè)runloop鐘箩溃。我的解決方案是獲取當(dāng)前的runloop瞭吃,然后將NSTimer放進(jìn)去。代碼如下

    NSRunLoop *run = [NSRunLoop currentRunLoop];
    [run addTimer:_timer forMode:NSRunLoopCommonModes];

或許大家會(huì)問為什么用第一個(gè)方法創(chuàng)建時(shí)能夠直接執(zhí)行那涣旨,我跟人的推測(cè)歪架,應(yīng)該運(yùn)用schedul創(chuàng)建的NSTimer,默認(rèn)會(huì)將當(dāng)前創(chuàng)建的NSTimer放到當(dāng)前的runloop中霹陡。
文章的最后我們說一下NSTimer的內(nèi)存釋放問題和蚪。因?yàn)镹STimer是需要加入runloop中,這就形成了一個(gè)典型的循環(huán)引用烹棉,所以我們必須顯示的釋放掉NSTimer惠呼,否則就會(huì)造成內(nèi)存泄漏。
特別強(qiáng)調(diào):
NSTimer的釋放不能放到dealloc中進(jìn)行峦耘,試問上面兩個(gè)哥們沒有停止剔蹋,dealloc怎么執(zhí)行。所以這里一定要注意辅髓,不能講NSTimer放到dealloc中釋放泣崩。至于在哪釋放少梁,根據(jù)自己需要的去釋放就好了。

[_timer invalidate];
    _timer = nil;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末矫付,一起剝皮案震驚了整個(gè)濱河市凯沪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌买优,老刑警劉巖妨马,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異杀赢,居然都是意外死亡烘跺,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門脂崔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來滤淳,“玉大人,你說我怎么就攤上這事砌左〔备溃” “怎么了?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵汇歹,是天一觀的道長(zhǎng)屁擅。 經(jīng)常有香客問我,道長(zhǎng)产弹,這世上最難降的妖魔是什么煤蹭? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮取视,結(jié)果婚禮上硝皂,老公的妹妹穿的比我還像新娘。我一直安慰自己作谭,他們只是感情好稽物,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著折欠,像睡著了一般贝或。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上锐秦,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天咪奖,我揣著相機(jī)與錄音,去河邊找鬼酱床。 笑死羊赵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播昧捷,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼闲昭,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了靡挥?” 一聲冷哼從身側(cè)響起序矩,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎跋破,沒想到半個(gè)月后簸淀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡毒返,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年租幕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饿悬。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡令蛉,死狀恐怖聚霜,靈堂內(nèi)的尸體忽然破棺而出狡恬,到底是詐尸還是另有隱情,我是刑警寧澤蝎宇,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布弟劲,位于F島的核電站,受9級(jí)特大地震影響姥芥,放射性物質(zhì)發(fā)生泄漏兔乞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一凉唐、第九天 我趴在偏房一處隱蔽的房頂上張望庸追。 院中可真熱鬧,春花似錦台囱、人聲如沸淡溯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咱娶。三九已至,卻和暖如春强品,著一層夾襖步出監(jiān)牢的瞬間膘侮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工的榛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留琼了,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓夫晌,卻偏偏與公主長(zhǎng)得像表伦,于是被迫代替她去往敵國(guó)和親谦去。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

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

  • 再一次面試中被問到nstimer的爭(zhēng)取使用方法蹦哼,原理鳄哭,我當(dāng)時(shí)就說了[_timer invalidate],time...
    iOS開發(fā)小平哥閱讀 4,056評(píng)論 1 13
  • 之前要做一個(gè)發(fā)送短信驗(yàn)證碼的倒計(jì)時(shí)功能纲熏,打算用NSTimer來實(shí)現(xiàn)妆丘,做的過程中發(fā)現(xiàn)坑還是有不少的。 基本使用 NS...
    WeiHing閱讀 4,381評(píng)論 1 8
  • 一局劲、什么是runloop 字面意思是“消息循環(huán)勺拣、運(yùn)行循環(huán)”。它不是線程鱼填,但它和線程息息相關(guān)药有。一般來講,一個(gè)線程一次...
    WeiHing閱讀 8,128評(píng)論 11 111
  • 目錄 引言 創(chuàng)建NSTimer 銷毀NSTimer NSTimer與runloop 附錄 引言 為什么想起來要討論...
    諾之林閱讀 16,331評(píng)論 25 106
  • Run loop 剖析:Runloop 接收的輸入事件來自兩種不同的源:輸入源(intput source)和定時(shí)...
    Mitchell閱讀 12,430評(píng)論 17 111