代码改变世界

NSTimer小结

2011-09-06 14:58  v2m  阅读(2654)  评论(0编辑  收藏  举报

一.说明

可以精确到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失效时不可调用