NSTimer使用注意事項

NSTimer使用注意事項#

存在延遲##

不管是一次性的還是周期性的timer的實際觸發(fā)事件的時間,都會與所加入的RunLoop和RunLoop Mode有關(guān),如果此RunLoop正在執(zhí)行一個連續(xù)性的運算,timer就會被延時出發(fā)。重復(fù)性的timer遇到這種情況,如果延遲超過了一個周期,則會在延時結(jié)束后立刻執(zhí)行,并按照之前指定的周期繼續(xù)執(zhí)行。

同一個timer在重復(fù)使用之前必需invalidate##

同一個timer在重復(fù)使用之前必需invalidate, 否則會造成之前的timer無法停掉,兩個timer同時存在。導(dǎo)致的現(xiàn)象就是timer同時更新兩次。

不要在dealloc函數(shù)中停止并釋放NSTimer##

如果這樣做,會導(dǎo)致對象永遠無法調(diào)用dealloc函數(shù),也就是會造成內(nèi)存泄漏。一個比較合理的解釋是NSTimer的回調(diào)方法具有retain屬性,所以不停止它的情況下被引用對象的retainCount無法降為0,導(dǎo)致內(nèi)存泄漏的死循環(huán)。

不用scheduled方式初始化的,需要將timer添加到runloop中##

NSTimer *myTimer = [NSTimer timerWithTimeInterval:3.0 target:self selector:@selector(timerFired:) userInfo:nilrepeats:NO];
[[NSRunLoopcurrentRunLoop] addTimer:myTimer forMode:NSDefaultRunLoopMode];

滑動UIScrollView的時候##

當(dāng)RunLoop處于UITrackingRunLoopMode模式的時候(滑動UIScrollView的時候),使用

scheduledTimerWithTimeInterval:(NSTimeInterval)seconds
                    invocation:(NSInvocation *)invocation
                       repeats:(BOOL)repeats

的類方法創(chuàng)建的Timer,是不會收到響應(yīng)事件。只有RunLoop切換到Default模式時才可以正常響應(yīng)。如果希望滑動時也可以響應(yīng)Timer時間,需要把Timer加到RunLoop并指定模式為NSRunLoopCommonModes。

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

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

  • NSTimer是ios上比較常用的定時器組件,在使用了一段時間后,發(fā)現(xiàn)有些地方是需要注意一下的。 NSTimer ...
    _Thinking_閱讀 1,033評論 2 9
  • 1. scheduled開頭和非schedule的開頭方法的區(qū)別。系統(tǒng)框架提供了幾種創(chuàng)建NSTimer的方法,其中...
    在下有雙閱讀 353評論 0 0
  • 一、performSelectorXXX之類的方法 1、performSelectorOnMainThread:w...
    朝雨晚風(fēng)閱讀 1,506評論 0 6
  • NSTimer是iOS最常用的定時器工具之一,在使用的時候常常會遇到各種各樣的問題,最常見的是內(nèi)存泄漏,通常我們使...
    bomo閱讀 1,348評論 0 7
  • 定時器: 需要被添加到Runloop,否則不會運行,當(dāng)然添加的Runloop不存在也不會運行 還要指定添加到的Ru...
    Sunli_閱讀 1,938評論 0 3

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