? ? ? ?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)
作為一個菜鳥,寫寫菜鳥代碼,有不足之處望大神們不吝賜教;
參考文章: