在Swift中查找Array和Dictionary的类型转换时偶尔会崩溃



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

报告显示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]]
}

…但它还是在同一个地方坠毁了。