美文网首页内存管理
iOS中定时器问题

iOS中定时器问题

作者: HJXu | 来源:发表于2016-02-11 11:30 被阅读149次

    在iOS开发中有三种方式创建定时器
    1,第一种
    scheduledTimerWithTimeInterval:invocation:repeats:
    或者scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:这两个类方法创建一个timer并把它指定到一个默认的runloop模式中,所以这种方式不需要我们手动添加到系统的runloop中
    2,第二种
    timerWithTimeInterval:invocation:repeats:
    或者timerWithTimeInterval:target:selector:userInfo:repeats:这两个类方法创建一个timer的对象,但并不会自动添加到系统run loop中 (你必须手动的调用NSRunLoop下对应的方法 addTimer:forMode: 去将它添加到一个runloop模式中.)
    3,第三种
    initWithFireDate:interval:target:selector:userInfo:repeats: 方法分配并创建一个NSTimer的实例 (当创建之后,你必须手动的调用NSRunLoop下对应的方法addTimer:forMode:去将它制定到一个runloop模式中.)
    [timer fire];// 可以通过fire这个方法去触发timer,即使timer的firing time没有到达
    NSTimer
    停止 [time setFireDate:[NSDate distantFunture]]
    启动 [time setFireDate:[NSDate distanPast]]
    继续[timer setFireDate:[NSDate date]]
    关于内存问题:
    如果我们启动了一个定时器,在某个界面释放前,将这个定时器停止,甚至置为nil,都不能是这个界面释放,原因是系统的循环池中还保有这个对象。所以我们需要加上下面的代码:

            [timer invalidate];
        }
        timer=nil;
    

    注:以下是对上面方法参数解释:
    1、参数repeats是指定是否循环执行,YES将循环,NO将只执行一次。
    2、timerWithTimeInterval这两个类方法创建出来的对象如果不用 addTimer: forMode方法手动加入主循环池中,将不会循环执行。并且如 果不手动调用fair,则定时器不会启动。
    3、scheduledTimerWithTimeInterval这两个方法不需要手动调用fair, 会自动执行,并且自动加入主循环池。
    4、init方法需要手动加入循环池,它会在设定的启动时间启动。

    关于定时器的文章链接
    http://www.cnblogs.com/ygm900/p/3946776.html

    相关文章

      网友评论

        本文标题:iOS中定时器问题

        本文链接:https://www.haomeiwen.com/subject/xucukttx.html