NSTimer使用注意事项

NSTimer使用注意事项#

存在延迟##

不管是一次性的还是周期性的timer的实际触发事件的时间,都会与所加入的RunLoop和RunLoop Mode有关,如果此RunLoop正在执行一个连续性的运算,timer就会被延时出发。重复性的timer遇到这种情况,如果延迟超过了一个周期,则会在延时结束后立刻执行,并按照之前指定的周期继续执行。

同一个timer在重复使用之前必需invalidate##

同一个timer在重复使用之前必需invalidate, 否则会造成之前的timer无法停掉,两个timer同时存在。导致的现象就是timer同时更新两次。

不要在dealloc函数中停止并释放NSTimer##

如果这样做,会导致对象永远无法调用dealloc函数,也就是会造成内存泄漏。一个比较合理的解释是NSTimer的回调方法具有retain属性,所以不停止它的情况下被引用对象的retainCount无法降为0,导致内存泄漏的死循环。

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

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

滑动UIScrollView的时候##

当RunLoop处于UITrackingRunLoopMode模式的时候(滑动UIScrollView的时候),使用

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

的类方法创建的Timer,是不会收到响应事件。只有RunLoop切换到Default模式时才可以正常响应。如果希望滑动时也可以响应Timer时间,需要把Timer加到RunLoop并指定模式为NSRunLoopCommonModes。

你可能感兴趣的:(NSTimer使用注意事项)