首页 > 解决方案 > EXC_BAD_ACCESS 在设备上,但在模拟器上工作

问题描述

我在Framework A下面写了一个函数:

open func invokeTracking(key: String, bundle: Bundle? = Bundle.main) {

    let qos = DispatchQoS.QoSClass.default
    DispatchQueue.global(qos: qos).async {
        self.invokeAsyncTracking(key: String, bundle: bundle)

}

我在 Xcode 项目的多个地方以及其他框架中调用它。

在 Xcode 项目中:

override func viewDidLoad() {
    super.viewDidLoad()
    HelperClass.invokeTracking(key: "Camino", bundle: Bundle? = Bundle.main)
}

同样从框架 B调用它

func callMainTracking() {
    super.viewDidLoad()
    HelperClass.invokeTracking(key: "Carthage", bundle: Bundle? = Bundle.main)
}

这工作正常,已经工作了将近一年。最近我像这样在调用跟踪方法中添加了另一个额外的默认参数,以免影响现有的方法调用,如下所示。我正在尝试设置全局变量的此参数的值:

open func invokeTracking(key: String, bundle: Bundle? = Bundle.main, conventDict: [String: Any] = [:]) {
    
    mainDict = conventDict

    let qos = DispatchQoS.QoSClass.default
    DispatchQueue.global(qos: qos).async {
        self.invokeAsyncTracking(key: String, bundle: bundle)

}

mainDict = conventDict尝试访问该默认参数时,该应用程序在该行的主线程中崩溃。如果我在异步中执行它,它会在该异步线程中崩溃。但是这种崩溃仅在从Framework B调用时发生,而不是在从 Xcode 项目调用时发生。此外,此崩溃仅发生在设备上。

我尝试了以下方法来解决这个问题:

  1. 试图将默认参数声明为可选并使用 if let 来解包它。
  2. 尝试了不同的数据类型。
  3. 通过更改参数顺序进行尝试。

它不会崩溃的唯一方法是,如果我在调用此方法时从框架 B发送此默认参数的值。

func callMainTracking() {
    super.viewDidLoad()
    HelperClass.invokeTracking(key: "Carthage", bundle: Bundle? = Bundle.main, conventDict: ["test": "123"])
}

但这违背了使用默认参数的目的。我是调试 Xcode 崩溃的新手,因此我们将不胜感激。

我使用仪器并试图找到一个僵尸,但没有一个。该应用程序只是崩溃了,没有检测到僵尸进程。

标签: swiftexc-bad-accessdispatch-async

解决方案


推荐阅读