设备上的EXC_BAD_ACCESS,但可在模拟器上使用

问题描述

我在 Framework A (框架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对其进行拆包。
  2. 尝试了不同的数据类型。
  3. 尝试通过更改参数顺序。

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

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

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

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)