iOS定时器的深度用法

问题:
/**
1.你知道NSTimer会retain你添加调用方法的对象吗?
2.你知道NSTimer并不是每次都准确按你设定的时间间隔来触发吗?
3.NSTimer需要和NSRunloop结合起来使用,你知道是怎么结合起来使用的吗?
4.你知道吗?除了用NSTimer实现定时器,还有别的方法能实现定时器吗?
*/
1.定时器的常用方式
2.fire方法的正确理解
3.定时器一定会在规定时间间隔内实时触发事件吗,.NSRunloopMode对定时器的影响
4.定时器引起的循环引用
5、GCD定时器

解答:
1.NSTimer通常有俩种使用方式,一种为timeWithTimeIntervel 另一种为schlduledTimerWithTimeInterval

2.fire方法的实际用处是 实时触发定时器,调用定时器方法

3.当定时器的runloopMode为默认的mode时,在主线程刷新UI时,mode会切换为traking,定时器会停掉,解决方法为指定runloopMode的模式为Common,Common模式包含了前俩种模式,并且在使用timeWithTimeIntervel方法时,必须后面使用addTimerForMode 方法添加到当前的runloop当中,schlduledTimerWithTimeInterval 方法会自动添加到当前runloop当中

4.如果定时器在主线程中创建,则需要在主线程中取消,如果在子线程中创建,则需要在子线程中取消(子线程执行方法:[NSThread detachNewThreadSelect:() to ...])
使用NSTimer 定时器会对当前tagart有一个强引用,runloop对timer有强引用, runloop-->timer-->self,,self-->tiomer造成循环引用,停止循环引用的方法为在页面销毁前timer 调用 invalidate 方法,把他从runloop中干掉,或者使用block(iOS10之后官方给出了带block的定时器可以避免循环引用)

5.GCD定时器的使用

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_source_t  timer =dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);
    dispatch_source_set_timer(timer,dispatch_time(DISPATCH_TIME_NOW, 0),1.0*NSEC_PER_SEC, 0); 
    dispatch_source_set_event_handler(timer, ^{

            dispatch_async(dispatch_get_main_queue(), ^{
                handler();
            });
    });
    dispatch_resume(timer);

其中的timer 为局部变量,在执行玩一次后会被释放,所以要想办法对他有一个强引用,不要让他提前释放,网上大多的方法为把他变成全局变量,延长他的生命周期,如果有别的方法能够使其强引用 也是可以的。

你可能感兴趣的:(iOS定时器的深度用法)