通过NSLog打印NSError始终会引发EXE_BAD_ACCESS

时间:2015-10-15 09:12:50

标签: ios swift swift2 nslog

我有一个用于检索远程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)")是引发错误的行

我的观察结果:

  • 首先,在我的调试窗口中error.description看起来 非常好。我可以毫无问题地看到数据。

  • 其次,如果我将NSLog更改为print(),那么一切正常 细<!/ p>

  • 最后,如果我将原始行更改为以下内容,它也会起作用

    NSLog(&#34; HTTP请求错误=(错误!.code),desc =%@&#34;,errorDesc)

是因为NSlog无法正确处理 String Interpolation 吗?

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

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

感谢您的时间! :)

1 个答案:

答案 0 :(得分:4)

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)")