GCD制作定時器NSTimer

? ? ? ?OC 中,經常用到計時器,但OC給出的NSTimer這個定時器制作的類在使用的時候有很多問題。

? ? ? 首先,在使用NSTimer的過程中,我們必須注意一個內存泄漏的問題,也就是說,做到NSTimer要及時銷毀。e g.

圖一

當用以上方法創建計時器的時候,我們通常時添加一個控制器上面,這樣就造成了當我們的控制器在壓棧的時候,不會銷毀,而會繼續計時。當然我們可以用如下方法解決:

圖二

但是這需要你對每一個定時器做特定的銷毀,不然就會內存泄漏。為了一勞永逸,(程序猿的”病“)這我還一個解決方案:那就是創建一個計時器不直接加在所要使用的控制器上,而是在中間加一個緩沖層,即在中間加一個類A,把定時器加在類A上,外面利用這個類創建計時器,并對這個類A進行弱運用。這樣就不會出現計時器不能被釋放的情況了:

圖三

? ? ? 其次,在使用上面的方法在遇到把定時器添加到一個scrollView上的時候,我們發現在滑動scrollView的時候,我們的定時器又不動了。這時,我還有解決方案:把它添加到次線程里面去并且把其模式設為NSRunLoopCommonModes。e g.

圖四

雖然以上的方法都能解決我們的問題,但是作為程序猿都有一顆求更完美的心;因此,我去找到了NSTimer的底層構成原理GCD:用CGD制作的計時器,我們不僅不用擔心其,銷毀問題,也不會有在scrollView滑動的時候出現計時器停止的問題。在利用GCD的時候,我發現一篇文章是說用到了這個方法:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(<#delayInSeconds#> * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{});來制作了一個計時器,并且有暫停等功能(代碼見github地址:https://github.com/StrongX/XTimer

但是,我覺得這個方法來用CGD的話,并沒有挖掘出其真正的強大之處,為此我也寫了一個CGD的計時器:主要原理是用了dispatch_queue_t,dispatch_source_t,dispatch_source_set_timer,dispatch_source_set_event_handler幾個CGD的函數來創建和處理事件,也包含了暫停、繼續、銷毀和重新開始功能。(代碼見github地址:https://github.com/jonkerit/HHTimer

作為一個菜鳥,寫寫菜鳥代碼,有不足之處望大神們不吝賜教;

參考文章:

http://www.cnblogs.com/Jenaral/p/5945755.html

http://www.lxweimin.com/p/583ca675065a

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 一. NSTimer NSTimer的初始化方法有以下幾種: 會自動啟動, 并加入* MainRunloop*的*...
    codeshow閱讀 526評論 0 0
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,041評論 25 708
  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一種新的協議。它實...
    香橙柚子閱讀 24,057評論 8 183
  • 據說,櫻花最盛,當數東京。但,于我,毫無感覺。因,它并非我夢中的櫻花,它少了夢中的詩意。武大的櫻花不同,雖未曾得見...
    淇畔芷影閱讀 253評論 0 3
  • 自學油畫以來,就覺得人生括然開朗,這幅是人物畫,有點不好意思拿出手 !
    黃慧心閱讀 180評論 0 1