swift2 由NSLog打印NSError时始终会引发EXE_BAD_ACCESS

o0lyfsai  于 2022-11-06  发布在  Swift
关注(0)|答案(1)|浏览(183)

我有一个检索远程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(),那么一切都很好!
  • 最后,如果我将原始行更改为以下行,它也可以工作

NSLog(“HTTP请求错误=(错误!.代码),描述= %@",错误描述)
是否因为NSlog无法正确处理字符串插值
如果是这样的话,那么为什么在某些情况下如"HTTP request error = \(error!.code),它能起作用呢?

**我的开发环境:**Xcode:OS X操作系统7.0.1版(7A 1001):约塞米蒂10.10.5(14 F27

感谢您抽出宝贵时间!!:)

velaa5lx

velaa5lx1#

NSLog()的第一个参数是一个 * 格式字符串 *,类似于C库中的printf()函数。此格式字符串用作模板,并包含 * 格式说明符 *,如%d%s%@ ......该格式指定如何解释其余参数。
现在在你的情况下

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

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

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

如果你想利用Swift字符串插值,那么只使用%@作为格式,并将插值后的String作为附加参数传递:

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

相关问题