libc++abi.dylib: terminate_handler unexpectedly threw an exception错误小结

转载 2015年07月09日 10:50:43

前言

我们在运行xcode工程时,有时候会遇到”libc++abi.dylib: terminate_handler unexpectedly threw an exception”错误,app莫名其妙就crash掉了,在控制台输入bt命令,查看调用堆栈,结果也是一头雾水:

libc++abi.dylib: terminate_handler unexpectedly threw an exception错误小结0

分析

现在唯一的信息点是libc++abi.dylib,这个库到底是做什么的?从后缀看,是一个动态库,那么会不会是因为发生了一些动态错误?而按经验来看,一般的动态错误基本是因为动态类型错误引起,在object-c语言中,会发生动态类型错误的可能基本存在于不可变类型与可变类型之间的转换,那么我们的查错范围将优先限制在不可变类型与可变类型转换上,是否我们对一个不可变类型进行了修改操作?当然,编译器没有那么傻,如果直接对一个不可变类型进行修改操作,是会直接报错的,那么就剩下另一种可能,程序将一个不可变类型赋值给可变类型,然后对可变类型进行了修改操作,这样可以通过静态检查,但是动态运行的时候,就会发生类型错误。基于以上分析,我们可以跟踪断点,会发现程序在对mutable对象进行add、set等操作时挂掉,而这个对象实际上赋值的是一个不可变对象。常见的情况是把一个NSArray对象赋值给一个NSMutableArray对象,然后进行了delete、add等修改操作,或者把一个NSDictionary对象赋值给一个NSMutableDictionary对象,然后进行了set等操作。

解决

解决办法很简单,赋值的时候进行类型转换: 
    //mutableArr:可变数组 arr:不可变数组
    //mutableDic:可变字典 dic:不可变字典
    //赋值时,需要进行可变类型转换
    mutableArr = [NSMutableArray arrayWithArray:arr];
    mutableDic = [NSMutableDictionary dictionaryWithDictionary:dic];

相关文章推荐

UIApplication sharedApplication详细解释-IOS

iPhone应用程序是由主函数main启动,它负责调用UIApplicationMain函数,该函数的形式如下所示:  int UIApplicationMain (  int argc,  c...

解决iOS报错libc++abi.dylib handler threw exception

在iOS开发时,有时候遇到libc++abi.dylib handler threw exception这样的异常,  虽然在断点出加上了All Exceptions,也断到相应的代码了,但是没打印对...

libc++abi.dylib: terminate_handler unexpectedly threw an exception错误小结

前言我们在运行xcode工程时,有时候会遇到”libc++abi.dylib: terminate_handler unexpectedly threw an exception”错误,app莫名其妙...

libc++abi.dylib: terminate_handler unexpectedly threw an exception//NSScanner: nil string argument

2015-04-03 18:16:10.077 YFFamilyMall[9283:256070] NSScanner: nil string argument 2015-04-03 18:16:10...

iOS报错terminate_handler unexpectedly threw an exception

今天遇到了一个非常奇葩的坑,但是我又不得不承认这也算是一个bug。 由于感觉这可能是万分之一的踩坑概率,所以我想把这个记录下来, 万一有和我一样莫名其妙被坑的人呢,嘿嘿...... ...
  • meyin
  • meyin
  • 2017-07-13 10:54
  • 174

libc++abi.dylib`__cxa_throw: 使用[AVAudioPlayer play]会产生__cxa_throw异常

libc++abi.dylib`__cxa_throw: 使用[AVAudioPlayer play]会产生__cxa_throw异常开发中遇到一个奇怪的异常。我调用AVAudioPlayer pla...

What Can I do if "The type initializer for 'Emgu.CV.CvInvoke' threw an exception"?

fromhttp://www.emgu.com/wiki/index.php/Download_And_Installation#Building_the_Examples The type...

使用Spire组件抛出异常The type initializer for 'spr857' threw an exception

使用Spire组件抛出异常The type initializer for 'spr857' threw an exception   我使用免费的Spire.Xls组件尝试去转换Exce...

Java SSM注解错误 HTTP Status 500 - Servlet.init() for servlet SpringMVC threw exception

学习的道路是漫长滴,错误也是天天有的,有搞了我3天。废话少说,先上错误: HTTP Status 500 - Servlet.init() for servlet SpringMVC thr...
  • JL_net
  • JL_net
  • 2017-03-16 13:43
  • 6240

关于SpringMVC设置注解注入出现Servlet.init() for servlet springMVC threw exception 错误解决方式

当配置xml文件时设置开启注解后,运行时出现如下错误exception javax.servlet.ServletException: Servlet.init() for servlet sprin...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)