• NSTimer的一个误区


    之前的写过一个单例,里面有一个NSTimer。当时写了NSTimer的stop和pause方法。现在突然发现当时写的方法是错误的。现在写出正确的方法。

    -(void)timestart
    {
        dispatch_queue_t queue=dispatch_queue_create("queue1", DISPATCH_QUEUE_SERIAL);
       dispatch_async(queue,^{
                if (!_timer) {
            _timer=[NSTimer scheduledTimerWithTimeInterval:0.01f target:self selector:@selector(UpdateUI) userInfo:nil repeats:YES];
        }
            [[NSRunLoop currentRunLoop] run];//必须放在定时器创建之后执行
    
        });
    }
    
    错误的暂停方法
    -(void)timepause
    {
    if(_timer.isValid)
    {
      [_timer invalidate];
    }
    }
    
    //为什么这个方法是错误的,今天看了苹果的文档,这个方法是吧timer移除NSRunloop.其实也就是一种销毁,如果你把这个方法作为暂停,下次其实你需要再启动timer,就必须得再调用timer的初始化方法,从逻辑上来说根本就不是暂停。当时的我就是犯了这么一个错误。
    
    
    //正确的方法
    -(void)timepause
    {
        if (!_timer.isValid) {
            return;
        }
        [_timer setFireDate:[NSDate distantFuture]];
    }
    //从暂停到重新运行timer
    -(void)timeresume
    {
        if (!_timer.isValid) {
            return;
        }
        [_timer setFireDate:[NSDate date]];
    }
    //停止方法,将timer移除runloop并且置为nil,在arc模式下timer的内存就会自动被释放
    -(void)timestop
    {
        if (_timer.isValid) {
            [_timer invalidate];
            _timer=nil;
        }
    }

    感觉没啥人会犯这种低级错误,写出来也算是提醒自己吧。

  • 相关阅读:
    git config 命令各参数有何区别
    Git 初始化
    Linux 安装 Git
    在Mac OS 上安装 Git
    maven 部署到远程仓库(私服)
    Git与SVN的区别
    windows挂载NFS文件系统无法访问/修改文件解决
    mysql5.7写入数据时间相差13/14小时解决
    mysql配置文件不生效解决
    springdata jpa mysql5.7写入中文乱码解决
  • 原文地址:https://www.cnblogs.com/xiaomingtongxue/p/4639746.html
Copyright © 2020-2023  润新知