疑难点积累(二)

来源:互联网 发布:淘宝龙瞎多少钱 编辑:程序博客网 时间:2024/05/18 07:40

1、NSTimer的使用

参考文章:http://www.cnblogs.com/smileEvday/archive/2012/12/21/NSTimer.html这里有详细的验证和说明

(1)timer会对它的target进行retain,直到timer自己失效为止。对重复执行的timer必须调用invalidate才能停止timer,让timer失效。

(2)timer并不是一种实时机制,不是你指定1s后执行,1s后就会立即执行。当线程空闲的时候,timer的触发时间还是比较准确的。但是当到达timer的触发时间时,线程却在执行一个连续的运算块,这个时候,timer只能等这个运算块执行完了,才能执行它自己的方法。如果这个线程的执行的时间超过了timer的一个周期,timer并不会触发两次消息,而只是触发一次。等线程忙完后,后面的消息触发时间仍然是与timer开始指定的时间成整数倍。所以说,timer并不会因为触发延迟而导致后面的触发时间发生延迟。

(3)timer也是一种资源,一个资源如果要起作用就得加到线程的runloop中,所以timer要加到runloop中才有用。如果一个runloop不包含任何资源,那他一运行就会马上退出。

A、使用 scheduledTimerWithTimeInterval:invocation:repeats: 或者scheduledTimerWithTimeInterval:target:selector:userInfo:repeats: 这两个类方法创建一个timer会把timer指定到一个默认的runloop模式中。

 B、使用 timerWithTimeInterval:invocation:repeats: 或者 timerWithTimeInterval:target:selector:userInfo:repeats:这两个类方法创建一个timer的对象,你必须手动的调用NSRunLoop下对应的方法 addTimer:forMode: 去将timer指定到一个runloop模式中。

C、 使用 initWithFireDate:interval:target:selector:userInfo:repeats: 方法分配并创建一个NSTimer的实例,当创建之后,你必须手动的调用NSRunLoop下对应的方法 addTimer:forMode: 去将它指定到一个runloop模式中。

(4)如何让timer在子线程的runloop中跑起来?

每个线程都有自己的runloop,新的线程的runloop必须自己去启动。

 [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];//将timer加到子线程的runloop中
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:3]];//启动子线程的runloop

0 0
原创粉丝点击