最近在进行之前项目的一个模块重构,之前的代码和现在的项目很多地方不兼容,包括网络请求,请求返回的实体和回调,另外还有蓝牙读卡器的错误的回调,总之改了很多代码吧,而且之前的代码逻辑还不敢改,怕写卡,读卡有问题。。。。。。
昨天提测发现闪退,断点一看是蓝牙读卡器的错误回调闪退,这。。。。。。一脸懵逼的不知道咋解决,看了好久。。。。。。
大致的原因也都知道,野指针,在对象被释放之后又调用了该对象,造成了闪退。
最后发现实际原因是error as NSError的时候失败了,然后再回调就野指针了。
这个问题还真是第一次遇见,闭包回调里的内容强转失败是会野指针的。只是自己真的看了好久也没解决,问题转变为Error怎么转NSError回调出去的问题。因为蓝牙读卡器的代码是OC写的,这边Swift代码需要拿到错误信息,奈何里面的错误信息还是自己封装的错误描述。。。。。。
最后还是师傅帮忙解决的,其实也就改了一句代码。
// 将 NFC 错误转成 HDLNFCError
let nfcError: Error? = {
if let error = error as NSError? {
let nfcToolError: HDLNFCCardToolError = HDLNFCCardToolError(rawValue: UInt(error.code))!
return NSError(domain: "", code: error.code, userInfo: ["errorMessage": HDLNFCError.HDLNFCInnerCardToolError.needRetry(nfcError: nfcToolError).localizedDescription])
} else {
return nil
}
}()
参考链接:
1.崩溃在Block中:
http://www.cocoachina.com/bbs/read.php?tid=1774084
2.Error和NSError的关系:
https://www.jianshu.com/p/a36047852ccc
3.NSError桥接:
https://github.com/apple/swift-evolution/blob/master/proposals/0112-nserror-bridging.md
每次遇到自己不能解决的问题的时候就感觉自己特菜,所以还是说呀,基础需要好好学习。