通过 NSLog 打印 NSError 总是引发 EXE_BAD_ACCESS

Printing NSError by NSLog always raises EXE_BAD_ACCESS

我有一个用于检索远程 json 文件的代码。我试图在网络不可用时打印错误(故意打开飞行模式以产生错误)。

但是每次,它都会在日志行

上引发一个EXE_BAD_ACCESS

我的代码是这样的:

        NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()){
(response: NSURLResponse?, data: NSData?, error: NSError?) -> Void in

            if(error != nil){
                let errorDesc = error!.description ?? ""

                NSLog("HTTP request error = \(error!.code), desc = \(errorDesc)")

                handler(houseList, error)
                return
            } 
            ...Omitted for Brevity...
    } 

NSLog("HTTP request error = \(error!.code), desc = \(errorDesc)") 是引发错误的行

我的观察:

是不是NSlog无法正确处理String Interpolation

如果是这样,那为什么在某些情况下,例如"HTTP request error = \(error!.code),它可以工作?

我的开发环境: Xcode:版本 7.0.1 (7A1001) OS X: Yosemite 10.10.5(14F27

感谢您的宝贵时间!! :)

NSLog() 的第一个参数是 格式字符串 ,类似于 C 库中的 printf() 函数。此格式字符串用于 作为模板并包含 format specifiers 比如%d, %s, %@, ... 格式指定如何 解释剩余的参数。

现在你的情况是

NSLog("HTTP request error = \(error!.code), desc = \(errorDesc)")

错误代码和描述被插入到格式字符串中。 如果错误描述恰好包含格式说明符(例如 %s),则 NSLog() 需要另一个参数(例如字符串)。 如果没有参数或者它的类型错误,则行为是 未定义,代码可能会崩溃。

因此,格式字符串应始终为常量字符串文字:

NSLog("HTTP request error = %ld, desc = %@", error!.code, errorDesc)

如果你想利用Swift字符串插值 然后仅使用 %@ 作为格式并传递内插的 String 作为附加参数:

NSLog("%@", "HTTP request error = \(error!.code), desc = \(errorDesc)")