通过 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)")
是引发错误的行
我的观察:
首先,在我的调试 window 中 error.description
看起来
非常好。我可以毫无问题地查看数据。
其次,如果我将 NSLog 更改为 print()
,那么一切正常
很好!
最后,如果我把原来的行改成下面这样,也行
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)")
我有一个用于检索远程 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)")
是引发错误的行
我的观察:
首先,在我的调试 window 中
error.description
看起来 非常好。我可以毫无问题地查看数据。其次,如果我将 NSLog 更改为
print()
,那么一切正常 很好!最后,如果我把原来的行改成下面这样,也行
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)")