libc++abi.dylib: terminate_handler unexpectedly threw an exception錯誤小結
前言
我們在運行xcode工程時左敌,有時候會遇到”libc++abi.dylib: terminate_handler unexpectedly threw an exception”錯誤扩灯,app莫名其妙就crash掉了,在控制臺輸入bt命令闹伪,查看調用堆棧亡电,結果也是一頭霧水:
分析
現(xiàn)在唯一的信息點是libc++abi.dylib届巩,這個庫到底是做什么的?從后綴看份乒,是一個動態(tài)庫恕汇,那么會不會是因為發(fā)生了一些動態(tài)錯誤?而按經(jīng)驗來看或辖,一般的動態(tài)錯誤基本是因為動態(tài)類型錯誤引起瘾英,在object-c語言中,會發(fā)生動態(tài)類型錯誤的可能基本存在于不可變類型與可變類型之間的轉換颂暇,那么我們的查錯范圍將優(yōu)先限制在不可變類型與可變類型轉換上缺谴,是否我們對一個不可變類型進行了修改操作?當然耳鸯,編譯器沒有那么傻湿蛔,如果直接對一個不可變類型進行修改操作膀曾,是會直接報錯的,那么就剩下另一種可能阳啥,程序將一個不可變類型賦值給可變類型添谊,然后對可變類型進行了修改操作,這樣可以通過靜態(tài)檢查察迟,但是動態(tài)運行的時候斩狱,就會發(fā)生類型錯誤≡浚基于以上分析所踊,我們可以跟蹤斷點,會發(fā)現(xiàn)程序在對mutable對象進行add概荷、set等操作時掛掉秕岛,而這個對象實際上賦值的是一個不可變對象。常見的情況是把一個NSArray對象賦值給一個NSMutableArray對象乍赫,然后進行了delete瓣蛀、add等修改操作陆蟆,或者把一個NSDictionary對象賦值給一個NSMutableDictionary對象雷厂,然后進行了set等操作。
解決
解決辦法很簡單叠殷,賦值的時候進行類型轉換:
//mutableArr:可變數(shù)組 arr:不可變數(shù)組
//mutableDic:可變字典 dic:不可變字典
//賦值時改鲫,需要進行可變類型轉換
mutableArr = [NSMutableArray arrayWithArray:arr];
mutableDic = [NSMutableDictionary dictionaryWithDictionary:dic];
二、還有一種情況林束,就是數(shù)組越界取值像棘,也有可能爆出這個動態(tài)庫的bug。
這個bug處理辦法就是檢查斷點所在的數(shù)組或者可變數(shù)組是不是為空壶冒,然后確保取值的時候數(shù)組不是空缕题,或者你要取值的下標小于或等于數(shù)組.count。