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。