NSTimer定时器使用

 

(一)定时器

  运用NSTimer类来创建定时器类,或者更简单的来说,就是定时器。定时器等待一个确定的时间间隔后,就会执行特定的消息给目标对象。例如可以创建一个NSTimer类发送消息给一个  window,告诉他在一个确定的时间间隔来update他自己。

  所以说定时器就是能够在接下来的时间执行或者周期执行方法的一个对象。

  那么问题来了,定时器未来的某一刻执行或者重复执行方法,如何保证那个时候我们要触发的方法还是有效的呢?

  其实timer都会对它的target进行retain。从而保证了timer调用时候的正确性,但是timer一直重复创建的,此时会出现内存泄露,就要有对应的invalidate。

  NSTimer其实也不是准时的。假设从现在开始3秒后在一个线程中执行定时器方法,但是这个线程当时有大量的运算,那么就必须等到运算结束才可以。所以说timer并不是一个实时的机制。是会出现延迟的。

  NSTimer创建后,要添加到runloop的对应mode中(一般defaultMode)。因为所有的事件都是在runloop中的。所以说必须把定时器加入到runLoop中才可以。schedu只是一个遍历方法,系统默认已经加入了运行循环。

  但是添加到运行循环后,也不一定执行。原因有两个。

  1.每一个线程都有自己的runLoop,主线程自己的runLoop是默认开启的,并且是个死循环。而子线程,自己新建的线程的的runLoop默认是关闭的,需要手动开启。

  2.RunLoopMode不正确。一般主线程就是DefaultMode,但是还有其他刷新表格,用于scrollView等上面的Mode。

(二)常用方法

  2.1 schedu:默认已经放到了运行循环并开启。

  2.2 timeWith:此方法要自己添加到运行循环并且fire

  

(三)定时器执行带参数的方法:传递参数会调用info消息。

- (void)ramdomAllTheTime {
    
    // 定时器持续
//    NSTimer *time = [NSTimer timerWithTimeInterval:0.5 target:self selector:@selector(change) userInfo:nil repeats:YES];
    
//    [[NSRunLoop currentRunLoop] addTimer:time forMode:NSDefaultRunLoopMode];
    
//    [time fire];
    
    [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(change:) userInfo:@"11" repeats:YES];
    
    
}


- (void)change:(NSTimer *)timer {
    
    NSLog(@"%@",timer.userInfo);
    
    [self setNeedsDisplay];
}

 

posted @ 2015-11-14 13:56  珍妮是谁  阅读(266)  评论(0编辑  收藏  举报