
最近在進(jìn)行之前項(xiàng)目的一個(gè)模塊重構(gòu),之前的代碼和現(xiàn)在的項(xiàng)目很多地方不兼容,包括網(wǎng)絡(luò)請(qǐng)求,請(qǐng)求返回的實(shí)體和回調(diào),另外還有藍(lán)牙讀卡器的錯(cuò)誤的回調(diào),總之改了很多代碼吧,而且之前的代碼邏輯還不敢改,怕寫卡,讀卡有問題。。。。。。
昨天提測(cè)發(fā)現(xiàn)閃退,斷點(diǎn)一看是藍(lán)牙讀卡器的錯(cuò)誤回調(diào)閃退,這。。。。。。一臉懵逼的不知道咋解決,看了好久。。。。。。
大致的原因也都知道,野指針,在對(duì)象被釋放之后又調(diào)用了該對(duì)象,造成了閃退。
最后發(fā)現(xiàn)實(shí)際原因是error as NSError的時(shí)候失敗了,然后再回調(diào)就野指針了。
這個(gè)問題還真是第一次遇見,閉包回調(diào)里的內(nèi)容強(qiáng)轉(zhuǎn)失敗是會(huì)野指針的。只是自己真的看了好久也沒解決,問題轉(zhuǎn)變?yōu)镋rror怎么轉(zhuǎn)NSError回調(diào)出去的問題。因?yàn)樗{(lán)牙讀卡器的代碼是OC寫的,這邊Swift代碼需要拿到錯(cuò)誤信息,奈何里面的錯(cuò)誤信息還是自己封裝的錯(cuò)誤描述。。。。。。
最后還是師傅幫忙解決的,其實(shí)也就改了一句代碼。
// 將 NFC 錯(cuò)誤轉(zhuǎn)成 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的關(guān)系:
http://www.itdecent.cn/p/a36047852ccc
3.NSError橋接:
https://github.com/apple/swift-evolution/blob/master/proposals/0112-nserror-bridging.md
每次遇到自己不能解決的問題的時(shí)候就感覺自己特菜,所以還是說呀,基礎(chǔ)需要好好學(xué)習(xí)。