加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Swift 3.0 解决Timer循环引用

发布时间:2020-12-14 06:38:47 所属栏目:百科 来源:网络整理
导读:今天封装一个无限轮播图,再次被Timer坑在了无限循环里。 在3.0中Timer的创建和使用是这样的 fileprivate var cycleTimer : Timer? cycleTimer = Timer(timeInterval: 3.0,target: self,selector: #selector(anyStrings),userInfo: nil,repeats: true)RunLoo
  • 今天封装一个无限轮播图,再次被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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读