我正在尝试为市场中的应用解决不常见的崩溃报告。
报告说EXC_BAD_ACCESS KERN_INVALID_ADDRESS在执行看似普通类型转换时:
if let 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
}
有没有更好的方法来确定收到的对象是数组还是字典?
答案 0 :(得分:1)
我忽略了指出上面代码的崩溃发生在后台线程上。我最初,也许错误地排除了线程争用问题,因为崩溃报告在任何其他线程上都没有包含对此代码的其他访问权。
但事实证明,将整个函数包装在“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]]
}
......但它仍然在同一个地方坠毁。