在Swift中进行类型转换以查找Array vs. Dictionary时偶尔会崩溃

时间:2015-10-09 15:11:35

标签: swift

我正在尝试为市场中的应用解决不常见的崩溃报告。

报告说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
}

有没有更好的方法来确定收到的对象是数组还是字典?

1 个答案:

答案 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]]
}

......但它仍然在同一个地方坠毁。