swift - 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 项目调用时发生。此外,此崩溃仅发生在设备上。
我尝试了以下方法来解决这个问题:
- 试图将默认参数声明为可选并使用 if let 来解包它。
- 尝试了不同的数据类型。
- 通过更改参数顺序进行尝试。
它不会崩溃的唯一方法是,如果我在调用此方法时从框架 B发送此默认参数的值。
func callMainTracking() {
super.viewDidLoad()
HelperClass.invokeTracking(key: "Carthage", bundle: Bundle? = Bundle.main, conventDict: ["test": "123"])
}
但这违背了使用默认参数的目的。我是调试 Xcode 崩溃的新手,因此我们将不胜感激。
我使用仪器并试图找到一个僵尸,但没有一个。该应用程序只是崩溃了,没有检测到僵尸进程。
解决方案
推荐阅读
- kubernetes - 如何找出 Kubernetes 中可用的端口?
- html - 移除 HTML 元素的蓝色轮廓
- jquery - 客户端可以从 $.get() jQuery 调用中获取 URL 吗?
- python - 传递单击的按钮以在 Tkinter 中运行
- xml - 在 XSLT 中显示 URL
- sql - 计算往返通勤中停靠站之间的时间
- react-native - 如何根据状态更新反应导航 5 headerRight 中的文本?
- java - Spring Data JPA - javax.persistence.TransactionRequiredException:执行更新/删除查询
- python - Django-admin 自定义命令不存储缓存值
- mysql - 由于外键无法创建表