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

Posted qigemingnan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了libc++abi.dylib: terminate_handler unexpectedly threw an exception错误小结相关的知识,希望对你有一定的参考价值。

说法一:

我们在运行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等操作。

 

解决

解决办法很简单,赋值的时候进行类型转换:

    //mutableArr:可变数组 arr:不可变数组
    //mutableDic:可变字典 dic:不可变字典
    //赋值时,需要进行可变类型转换
    mutableArr = [NSMutableArray arrayWithArray:arr];
    mutableDic = [NSMutableDictionary dictionaryWithDictionary:dic];

现身说法: 又时候 Xcode 不会报出具体错误, 我就遇到过,数组越界的时候 也会 报这个错误

以上是关于libc++abi.dylib: terminate_handler unexpectedly threw an exception错误小结的主要内容,如果未能解决你的问题,请参考以下文章

Swift 2 到 3 迁移错误(libc++abi.dylib:以 NSException 类型的未捕获异常终止)

UITableViewDataSource 导致 libc++abi.dylib:以 NSException 类型的未捕获异常终止

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

libc++abi.dylib:以 NSException (lldb) 类型的未捕获异常终止 TabBarController->TableViews->ViewControllers

libc++abi.dylib: terminate_handler 意外抛出异常 - 0 堆栈跟踪 iOS7 / iOS 8

(Swift 3) 父子上下文崩溃核心数据 (libc++abi.dylib: 以 NSException (Recorded Frame) 类型的未捕获异常终止)