gpt4 book ai didi

swift - 在 Swift 中进行类型转换以查找数组与字典时偶尔会发生崩溃

转载 作者:行者123 更新时间:2023-11-28 06:57:27 29 4
gpt4 key购买 nike

我正在尝试解决市场上应用程序的罕见崩溃报告。

报告说 EXC_BAD_ACCESS KERN_INVALID_ADDRESS 在执行看似正常的类型转换时:

如果让 responseArray = response as? [[String: AnyObject]]

请参阅下面代码段第 11 行的违规代码。

有什么线索可以说明为什么会在这里发生崩溃吗?我似乎无法用模拟器或附加设备重现它。

func callingFunction() {
if var response: AnyObject = aFunction { //aFunction returns AnyObject?
if let response = response as? [[String: AnyObject]] {
someFunction(response)
}
}
}

func someFunction(response: AnyObject) {
var responses = [[String: AnyObject]]()
if let responseArray = response as? [[String: AnyObject]] { // Crashes here - sometimes
responses = responseArray
} else if let responseDictionary = response as? [String: AnyObject] {
responses.append(responseDictionary)
} else {
assertionFailure("Response has unexpected type, response:\(response)")
}
// Do a other stuff
}

有没有更好的方法来判断接收到的对象是数组还是字典?

最佳答案

我没有指出上面代码的崩溃发生在后台线程上。我最初可能错误地排除了线程争用问题,因为崩溃报告不包含在任何其他线程上对该代码的其他访问。

但事实证明,将整个函数包装在一个“obj_sync”中就解决了这个问题。像这样...

func someFunction(response: AnyObject) {
objc_sync_enter(self)
// Do the same code as above
objc_sync_exit(self)
}

此外,指出解决问题的失败尝试可能对其他人有所帮助。我替换了...

if let responseArray = response as? [[String: AnyObject]] {
responses = responseArray
}

与...

if response is Array<Dictionary<String, AnyObject>> {
responses = response as! [[String : AnyObject]]
}

...但它仍然在同一个地方崩溃。

关于swift - 在 Swift 中进行类型转换以查找数组与字典时偶尔会发生崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33041734/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com