libc++abi.dylib: terminate_handler unexpectedly threw an exception错误小结
2015-12-03 09:18
423 查看
http://blog.csdn.net/nextstudio/article/details/42964539
[objc] view
plaincopy
//mutableArr:可变数组 arr:不可变数组
//mutableDic:可变字典 dic:不可变字典
//赋值时,需要进行可变类型转换
mutableArr = [NSMutableArray arrayWithArray:arr];
mutableDic = [NSMutableDictionary dictionaryWithDictionary:dic];
前言
我们在运行xcode工程时,有时候会遇到”libc++abi.dylib: terminate_handler unexpectedly threw an exception”错误,app莫名其妙就crash掉了,在控制台输入bt命令,查看调用堆栈,结果也是一头雾水:分析
现在唯一的信息点是libc++abi.dylib,这个库到底是做什么的?从后缀看,是一个动态库,那么会不会是因为发生了一些动态错误?而按经验来看,一般的动态错误基本是因为动态类型错误引起,在object-c语言中,会发生动态类型错误的可能基本存在于不可变类型与可变类型之间的转换,那么我们的查错范围将优先限制在不可变类型与可变类型转换上,是否我们对一个不可变类型进行了修改操作?当然,编译器没有那么傻,如果直接对一个不可变类型进行修改操作,是会直接报错的,那么就剩下另一种可能,程序将一个不可变类型赋值给可变类型,然后对可变类型进行了修改操作,这样可以通过静态检查,但是动态运行的时候,就会发生类型错误。基于以上分析,我们可以跟踪断点,会发现程序在对mutable对象进行add、set等操作时挂掉,而这个对象实际上赋值的是一个不可变对象。常见的情况是把一个NSArray对象赋值给一个NSMutableArray对象,然后进行了delete、add等修改操作,或者把一个NSDictionary对象赋值给一个NSMutableDictionary对象,然后进行了set等操作。解决
解决办法很简单,赋值的时候进行类型转换:[objc] view
plaincopy
//mutableArr:可变数组 arr:不可变数组
//mutableDic:可变字典 dic:不可变字典
//赋值时,需要进行可变类型转换
mutableArr = [NSMutableArray arrayWithArray:arr];
mutableDic = [NSMutableDictionary dictionaryWithDictionary:dic];
相关文章推荐
- HPP
- C++11 在析构函数中执行lambda表达式(std::function)捕获this指针的陷阱
- C语言 计算水仙花数
- 《C++ Primer》学习 之 编译器推断auto类型
- tiny4412开发板 之 浅谈为什么使用 内嵌汇编
- 【C语言提高19】【字符串模型】两头堵模型
- 递归与尾递归总结
- AES加密 java&c++版本
- c语言—循环结构编程实例
- C++primer_关联容器之map
- C++开源项目
- C++中explicit关键字解释
- 【iOS】libc++abi.dylib: terminate_handler unexpectedly threw an exception
- 【c++】用c++实现Date类
- C++学习网站
- c语言变量名称与变量
- C语言中的位拷贝与值拷贝浅谈(转载)
- 判断2000年---2500年之间的闰年
- C#客户端连接C++服务器 目标机器积极拒绝
- C++ 之使用标准库函数对象和函数适配器