今天测试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就解决问题了。.net
20151203更新:调试
遇到这种错误:
-[__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这种错了。
参考:
UITableView删除的时候崩溃NSScanner:nil string argument