NSTimer

一.線程阻塞問題

1.主線程

主界面添加一個 UITabView, 程序啟動后拖動 UITabView .

(1) NSRunLoopMode : NSDefaultRunLoopMode

控制臺顯示,拖動 UI 期間定時器停止打印.


NSRunLoopCommonModes

(2) NSRunLoopMode : NSRunLoopCommonModes?

拖動 UI 期間定時器不停止

總結(jié):主線程的阻塞與 NSRunLoopMode 有關.

2.子線程

子線程運行 timer

此時會阻塞子線程,待 timer 倒計時結(jié)束后才會依次執(zhí)行之后的方法.

(1)拖動 UI 不會阻塞 timer 計時.

(2)與 NSRUNLoopMode 無關.

(3)repeats? 如果設置為 yes,將永遠不會執(zhí)行下面這行代碼.

?NSLog(@"222當前線程:%@",[NSThread currentThread]);

注意: timer 添加到子線程的Runloop 中時,需要啟動 Runloop.

[[NSRunLoop currentRunLoop] run];

二.不能釋放當前對象問題

界面布局
控制器代碼及 log 信息

實際使用 timer 的過程中,我們經(jīng)常會有如下場景.

如果我就是想讓這個 NSTimer 一直輸出,直到 ViewController 銷毀了才停止,我該如何讓它停止呢?

NSTimer 被 Runloop 強引用了,如果要釋放就要調(diào)用 invalidate 方法。

但是我想在 ViewController 的 dealloc 里調(diào)用 invalidate 方法,但是 self 被 NSTimer 強引用了。

所以我還是要釋放 NSTimer 先,然而不調(diào)用 invalidate 方法就不能釋放它。

然而你不進入到 dealloc 方法里我又不能調(diào)用 invalidate 方法。

嗯…

此時 timer 就會一直持有當前對象,當控制器 dismiss 時,并不會執(zhí)行 dealloc 方法, timer 也不會被銷毀.

解決方法:

我們可以造個假的 target 給 NSTimer.這個假的 target 類似于一個中間的代理人,它做的唯一的工作就是挺身而出接下了 NSTimer 的強引用.

參考地址:NSTimer

源碼地址:源碼地址


親測有效

iOS10之后系統(tǒng)出了如下方法

+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)interval repeats:(BOOL)repeats block:(void (^)(NSTimer *timer))block API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0));

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)interval repeats:(BOOL)repeats block:(void (^)(NSTimer *timer))block API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0));

看起來跟文章中給出的方法差不多,但是測試并沒有解決這個問題.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • /** * 定義一個定時器 */ timer = [NSTimer scheduledTimerWithTimeI...
    錢塘老酒釀閱讀 2,061評論 0 9
  • NSTimer是iOS最常用的定時器工具之一,在使用的時候常常會遇到各種各樣的問題,最常見的是內(nèi)存泄漏,通常我們使...
    bomo閱讀 1,343評論 0 7
  • 參考鏈接: NSTimer需要注意的地方這是大神寫的整個思路及解決辦法的文章 一.NSTimer和Run loop...
    anyurchao閱讀 856評論 0 1
  • 已經(jīng)將近兩年沒有寫過文章了,之前記錄的知識點都在有道筆記上,看到網(wǎng)上那么多人分享知識,突然也想重新寫了,分享知識能...
    羊羊養(yǎng)閱讀 2,435評論 6 8
  • 之前要做一個發(fā)送短信驗證碼的倒計時功能,打算用NSTimer來實現(xiàn),做的過程中發(fā)現(xiàn)坑還是有不少的。 基本使用 NS...
    WeiHing閱讀 4,466評論 1 8

友情鏈接更多精彩內(nèi)容