今天測試app時發現一個必現的異常,當在登陸成功後再打開登陸前點擊的頁面時,就會在Xcode console中打印以下日誌:php
NSScanner:nil string argument
NSScanner:nil string argument
libc++abi.dylib: terminate_handler unexpectedly threw an exception
而後app就會crash掉。
搜索了一下相關資料,得知出現NSScanner: nil string argument問題都是跟字符串有關,通常認爲是intWithString:的參數傳入了nil就會出現這個問題。可是項目的代碼中並無幾處intWithString:的地方,逐一加斷點都排除了出問題的可能。
而後我單步調試,發現問題可能出在這幾行代碼:
NSDictionary *para=nil;
para=@{@"userid":[Configs getInstance].me.uid, @"flag":@"1" };
html
那麼最有問題的可能在這裏:[Configs getInstance].me.uid,會不會在它爲nil時出現上面的crash問題呢?通過驗證,在出現crash以前這個uid值果真爲nil,又是前人留下的坑……對代碼進行了一些調整,此問題解決。c++
20150411更新:xcode
出現NSScanner:nil string argument這個問題頗有多是由於你在項目中用了友盟的SDK,這樣的錯誤信息很是不利於定位,能夠先把調用友盟SDK的代碼註釋掉來定位問題。app
20151119更新:post
這篇文章libc++abi.dylib: terminate_handler unexpectedly threw an exception錯誤小結 對這個問題進行了一些分析:測試
如今惟一的信息點是libc++abi.dylib,這個庫究竟是作什麼的?從後綴看,是一個動態庫,那麼會不會是由於發生了一些動態錯誤?而按經驗來看,通常的動態錯誤基本是由於動態類型錯誤引發,在object-c語言中,會發生動態類型錯誤的可能基本存在於不可變類型與可變類型之間的轉換,那麼咱們的查錯範圍將優先限制在不可變類型與可變類型轉換上,是否咱們對一個不可變類型進行了修改操做?固然,編譯器沒有那麼傻,若是直接對一個不可變類型進行修改操做,是會直接報錯的,那麼就剩下另外一種可能,程序將一個不可變類型賦值給可變類型,而後對可變類型進行了修改操做,這樣能夠經過靜態檢查,可是動態運行的時候,就會發生類型錯誤。基於以上分析,咱們能夠跟蹤斷點,會發現程序在對mutable對象進行add、set等操做時掛掉,而這個對象實際上賦值的是一個不可變對象。常見的狀況是把一個NSArray對象賦值給一個NSMutableArray對象,而後進行了delete、add等修改操做,或者把一個NSDictionary對象賦值給一個NSMutableDictionary對象,而後進行了set等操做。ui
然而我今天又遇到這樣的問題,單步調試發現crash發生在dequeueReusableCellWithIdentifier:方法這裏。定位到最後才發如今代碼裏把一個IBOutlet更名了,可是xib裏這個更名前的IBOutlet還存在,去掉更名前的IBOutlet就解決問題了。spa
20151203更新:.net
遇到這種錯誤:
-[__NSArrayI length]: unrecognized selector sent to instance 0x1686d110
[;libc++abi.dylib: terminate_handler unexpectedly threw an exception
正常狀況下用Xcode Debug是看不到這發生crash的位置的,只知道是某個字符串變成了NSArray呢?怎麼快速定位呢,拔掉數據線,再重現一次Crash,而後再鏈接數據線,選擇Xcode菜單上的Window——Devices,在左側列表找到設備名,點擊其右的View Device Logs,定位到剛剛發生的crash log,點右鍵選擇Re-Symbolicate Log,稍等片刻你就能夠解析後的Crash log了,這個時候就很容易看到crash發生的代碼行了。
今天用PushViewController時又遇到這種錯誤,緣由是新建了一個VC,沒用Xib,後來又想用Xib因而又單獨新建了一個Xib,可是沒有把File's Owner中的View屬性與View關聯,就報了libc++abi.dylib: terminate_handler unexpectedly threw an exception這種錯了。
這是支付寶推出的一個最新活動,用支付寶掃碼即有紅包送,0元到99元不等,紅包能夠到店支付使用,每日僅可領一次。你每用一個紅包,做者便可獲得支付寶送出的1毛賞金,若是你以爲這篇文章對你有用,那不如掃碼支持一下做者吧!
參考:
UITableView刪除的時候崩潰NSScanner:nil string argument