swift3:调度队列暂停和恢复应用程序崩溃:线程1个exc_bad_instruction(代码= exc_i386_invop子码=为0x0)

问题描述 投票:2回答:1

我正在与其中4个Uilabels添加为子视图时间后,各派出定制队列登录后tvos琐事查看

用于调度功能队列是:

func delayWithSeconds(_ seconds: Double, completion: @escaping () -> ()) {

 self.TriviaDispatchQueue?.asyncAfter(deadline: .now() + seconds, qos: .default, flags: DispatchWorkItemFlags.detached, execute: {
                 DispatchQueue.main.sync {
                    completion()
                }

            })
   }

我派遣的代码是:

func showTrivia() {

  self.TriviaDispatchQueue = DispatchQueue(label: "TriviaQueue")

    self.delayWithSeconds(5, completion: {

                        self.fadeIn(forView: self.Answer0Lbl)

                        self.delayWithSeconds(2, completion: {

                            self.fadeIn(forView: self.Answer1Lbl)


                            self.delayWithSeconds(2, completion: {

                                self.fadeIn(forView: self.Answer2Lbl)
                                self.delayWithSeconds(2, completion: {

                                    self.fadeIn(forView: self.Answer3Lbl)

                                })
                            })
                        })
                    })
}

因此,当用户从小事视图从顶部菜单移动到其他浏览电视,然后暂停队列停止琐事

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    onMainThread {
                       self.TriviaClass.TriviaDispatchQueue?.suspend()
                 }
}

之后,当用户返回到花絮然后查看队列恢复:

override func viewDidAppear(_ animated: Bool) {
 super.viewDidAppear(animated)

 onMainThread {
                   self.TriviaClass.TriviaDispatchQueue?.resume()
              }
}

一切正常,在第一次登录,但注销后,再次重新登录精细崩溃的应用程序:线程1个exc_bad_instruction(代码= exc_i386_invop子码=为0x0)

TRIVIA类是具有可变共享

var TriviaDispatchQueue: DispatchQueue?
swift3 queue xcode8 tvos dispatch
1个回答
0
投票

所以我挺晚在这里聚会,但我可以告诉你到底是什么问题:

而在暂停状态A dispatch_source(此处为队列)获取释放。这是不允许的。 (参考计数决定TriviaClass不需要了,但第一解除分配的dispatch_queue。)

我无法找到一个链接到文件,但GCD的一位工程师在这里解释它:

https://developer.apple.com/videos/play/wwdc2016/720/?time=2005(我想你需要一个苹果开发者账户,以观看这些,真的不知道,但...)

解决办法:我会建议在所有未暂停任何dispatch_source的。永远。 (也许在单元测试,但在生产代码,你只需要添加危险的定时炸弹在你的代码,几乎是不可能进行调试。)在派遣块添加一个检查,如果仍然需要块或依靠弱指针不执行代码前面出动,但不打算再运行。

© www.soinside.com 2019 - 2024. All rights reserved.