Swift 3.0 解决Timer循环引用

前端之家收集整理的这篇文章主要介绍了Swift 3.0 解决Timer循环引用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
  • 今天封装一个无限轮播图,再次被Timer坑在了无限循环里。
    • 在3.0中Timer的创建和使用是这样的
    • fileprivate var cycleTimer : Timer? 
      cycleTimer = Timer(timeInterval: 3.0,target: self,selector: #selector(anyStrings),userInfo: nil,repeats: true)
      RunLoop.main.add(cycleTimer!,forMode: .commonModes)

      通常我们会和OC一样在deinit{}函数中这样干

      cycleTimer?.invalidate()//移除
       cycleTimer = nil

      不要以为这样做就万事大吉。当你pop回到上个界面的时候,你会发现你Timer仍在计时,这不难发现,一般我们会打印计时数字。由此我们想到程序压根就没有走deinit{}函数,我们写好的两行代码也不会执行。

    • 解决办法:

      1. 你可以在使用这个View的控制器中,在视图进入后台前对Timer进行销毁操作。(不符合低耦合)

      2. 优秀的办法:

      • //cycleTimer = Timer(timeInterval: 3.0,selector: #selector(scrollToNextPage),repeats: true)
          weak var weakSelf = self
          cycleTimer = Timer(timeInterval: 1,repeats: true,block: {(timer) in
               weakSelf!.anyString()
           })
          RunLoop.main.add(cycleTimer!,forMode: .commonModes)

        这样做过之后,你必须要在deinit{}函数中销毁计时器,否则你的程序会crash

        • cycleTimer?.invalidate()//移除
           cycleTimer = nil

猜你在找的Swift相关文章