我正在尝试解决市场中应用程序的罕见崩溃报告。
报告显示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
}
是否有更好的方法来确定接收到的对象是数组还是字典?
我忘记指出上面代码的崩溃发生在后台线程上。我最初(也许是错误地)排除了线程争用问题,因为崩溃报告中没有包含任何其他线程上对该代码的其他访问。
但事实证明,将整个函数包装在"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]]
}
…但它还是在同一个地方坠毁了。