一.说明
可以精确到50-100毫秒,和CFRunLoopRef是"toll-free bridged",可以重复间隔或不可重复.NSTimer不是绝对准确的,而且中间耗时或阻塞错过下一个点,那么下一个点就pass过去了.
二.方法
1.创建
没有scheduled的话需要手动addTimer:forMode:添加timer到一个ruloop中,scheduled的以默认mode直接添加到当前的runloop中.
+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation *)invocation repeats:(BOOL)yesOrNo;
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation *)invocation repeats:(BOOL)yesOrNo;
+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo;
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo;
#if MAC_OS_X_VERSION_10_2 <= MAC_OS_X_VERSION_MAX_ALLOWED || __IPHONE_2_0 <= __IPHONE_OS_VERSION_MAX_ALLOWED
- (id)initWithFireDate:(NSDate *)date interval:(NSTimeInterval)ti target:(id)t selector:(SEL)s userInfo:(id)ui repeats:(BOOL)rep;
#endif
2.开始
- (void)fire;
//立即运行timer对应的方法,如果timer不重复,那么timer之后会失效;如果timer重复,timer的开始时间会从这里开始计算,以后就算再次手动调用fire,也不会改变这个时间
- (NSDate *)fireDate;
//下一次运行时间,若已经失效,返回上次运行时间(?为什么我的返回的是2001-1-1?)
#if MAC_OS_X_VERSION_10_2 <= MAC_OS_X_VERSION_MAX_ALLOWED || __IPHONE_2_0 <= __IPHONE_OS_VERSION_MAX_ALLOWED
- (void)setFireDate:(NSDate *)date;
//设置timer下一次运行的时间,如果date比现在早,那么立刻运行
#endif
- (NSTimeInterval)timeInterval;
//不重复的timer始终返回0
- (void)invalidate;
//唯一的从NSRunLoop中移除释放timer的方法,只能是拥有timer的线程中跳用该函数,否则可能不起作用
- (BOOL)isValid;
- (id)userInfo;
//当tmer失效时不可调用