iOS开发-NSTimer的使用艺术

开始前咱们先知道NSTimer是用来的干嘛的。

 A timer waits until a certain time interval has elapsed and then fires, 
sending a specified message to a target object.

从这里我们可以看出来,NSTimer就是我为了过一段时间想目标发送一个消息,从而执行一系列的操作。既然我们已经知道用法。所以咱们先来个最简单的用法

[NSTimer scheduledTimerWithTimeInterval:1.5 target:self selector:@selector(run:) userInfo:nil repeats:YES];

方法实现里直接打印helloworld就好,这里我就不再占用篇幅去写了。自己去补就好。上面这个函数的意思就是每隔1.5秒执行一次run方法。注意:如果repeats参数为NO时,只会执行一遍该方法。
接下来我们看看怎样控制定时器的开关

[_timer setFireDate:[NSDate distantFuture]];

调用上面语句,定时器就会关闭

[_timer setFireDate:[NSDate distantPast]];

上面就是开启定时器
关于NSTimer也不能说的太深,因为牵涉到一些runloop的知识。大家有兴趣的可以去研究一下。我也做过这方面的研究,只可惜研究尚欠,难等大雅之堂,今天就不跟大家分享,等我研究的小有成就的时候。在跟大家分享。
今天我在做AVPlayer的自定义过程中有要用到定时器,其中就涉及到runloop,今天我跟新博文不为谈runloop的底层实现,只为谈涉及到NSTimer一些bug的解决方案;
问题假设,我们需要程序定时做一件事,这个时候我们创建NSTimer

_timer = [NSTimer timerWithTimeInterval:1.5 target:self selector:@selector(nslog) userInfo:nil repeats:YES];

细心的同学会发现,这个NSTimer不会被执行,即使我们调用上面的开启方法,也不会执行。下面跟大家简单谈一下NSTimer的底层实现。
当我们创建NSTimer后,只有将NSTimer放到一个事件循环链(eventloop)中,NSTimer才能一直执行下去,iOS中我们实现的方法就是放到runloop中。所以我们想要让上面创建的NSTimer执行,我们就必须将NSTimer放到一个runloop钟。我的解决方案是获取当前的runloop,然后将NSTimer放进去。代码如下

    NSRunLoop *run = [NSRunLoop currentRunLoop];
    [run addTimer:_timer forMode:NSRunLoopCommonModes];

或许大家会问为什么用第一个方法创建时能够直接执行那,我跟人的推测,应该运用schedul创建的NSTimer,默认会将当前创建的NSTimer放到当前的runloop中。
文章的最后我们说一下NSTimer的内存释放问题。因为NSTimer是需要加入runloop中,这就形成了一个典型的循环引用,所以我们必须显示的释放掉NSTimer,否则就会造成内存泄漏。
特别强调:
NSTimer的释放不能放到dealloc中进行,试问上面两个哥们没有停止,dealloc怎么执行。所以这里一定要注意,不能讲NSTimer放到dealloc中释放。至于在哪释放,根据自己需要的去释放就好了。

[_timer invalidate];
    _timer = nil;

你可能感兴趣的:(iOS开发-NSTimer的使用艺术)