GCD制作定时器NSTimer

       OC 中,经常用到计时器,但OC给出的NSTimer这个定时器制作的类在使用的时候有很多问题。

      首先,在使用NSTimer的过程中,我们必须注意一个内存泄漏的问题,也就是说,做到NSTimer要及时销毁。e g.

图一

当用以上方法创建计时器的时候,我们通常时添加一个控制器上面,这样就造成了当我们的控制器在压栈的时候,不会销毁,而会继续计时。当然我们可以用如下方法解决:

图二

但是这需要你对每一个定时器做特定的销毁,不然就会内存泄漏。为了一劳永逸,(程序猿的”病“)这我还一个解决方案:那就是创建一个计时器不直接加在所要使用的控制器上,而是在中间加一个缓冲层,即在中间加一个类A,把定时器加在类A上,外面利用这个类创建计时器,并对这个类A进行弱运用。这样就不会出现计时器不能被释放的情况了:

图三

      其次,在使用上面的方法在遇到把定时器添加到一个scrollView上的时候,我们发现在滑动scrollView的时候,我们的定时器又不动了。这时,我还有解决方案:把它添加到次线程里面去并且把其模式设为NSRunLoopCommonModes。e g.

图四

虽然以上的方法都能解决我们的问题,但是作为程序猿都有一颗求更完美的心;因此,我去找到了NSTimer的底层构成原理GCD:用CGD制作的计时器,我们不仅不用担心其,销毁问题,也不会有在scrollView滑动的时候出现计时器停止的问题。在利用GCD的时候,我发现一篇文章是说用到了这个方法:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(<#delayInSeconds#> * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{});来制作了一个计时器,并且有暂停等功能(代码见github地址:https://github.com/StrongX/XTimer

但是,我觉得这个方法来用CGD的话,并没有挖掘出其真正的强大之处,为此我也写了一个CGD的计时器:主要原理是用了dispatch_queue_t,dispatch_source_t,dispatch_source_set_timer,dispatch_source_set_event_handler几个CGD的函数来创建和处理事件,也包含了暂停、继续、销毁和重新开始功能。(代码见github地址:https://github.com/jonkerit/HHTimer

作为一个菜鸟,写写菜鸟代码,有不足之处望大神们不吝赐教;

参考文章:

http://www.cnblogs.com/Jenaral/p/5945755.html

http://www.jianshu.com/p/583ca675065a

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一. NSTimer NSTimer的初始化方法有以下几种: 会自动启动, 并加入* MainRunloop*的*...
    codeshow阅读 526评论 0 0
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,296评论 25 708
  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一种新的协议。它实...
    香橙柚子阅读 24,110评论 8 183
  • 据说,樱花最盛,当数东京。但,于我,毫无感觉。因,它并非我梦中的樱花,它少了梦中的诗意。武大的樱花不同,虽未曾得见...
    淇畔芷影阅读 257评论 0 3
  • 自学油画以来,就觉得人生括然开朗,这幅是人物画,有点不好意思拿出手 !
    黄慧心阅读 182评论 0 1