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

今天在给一个UIViewcontroller加了*一个MJ刷新,就爆了个这问题

libc++abi.dylib: terminate_handler unexpectedly threw an exception”**只有这个,异常都逮不到

后来开始各种查资料

现在唯一的信息点是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];

这么搞了半天该换的换了,还是解决不了,后来想起来,MJ刷新,貌似有个帮助文档

 MJ友情提示:
 1. 添加头部控件的方法
 MJRefreshHeaderView *header = [MJRefreshHeaderView header];
 header.scrollView = self.collectionView; // 或者tableView
 
 2. 添加尾部控件的方法
 MJRefreshFooterView *footer = [MJRefreshFooterView footer];
 footer.scrollView = self.collectionView; // 或者tableView
 
 3. 监听刷新控件的状态有2种方式:
 * 设置delegate,通过代理方法监听(参考MJCollectionViewController.m)
 * 设置block,通过block回调监听(参考MJTableViewController.m)
 
 4. 可以在MJRefreshConst.h和MJRefreshConst.m文件中自定义显示的文字内容和文字颜色
 
 5. 本框架兼容iOS6\iOS7,iPhone\iPad横竖屏
 
 6.为了保证内部不泄露,最好在控制器的dealloc中释放占用的内存
    - (void)dealloc
    {
        [_header free];
        [_footer free];
    }
 
 7.自动刷新:调用beginRefreshing可以自动进入下拉刷新状态
 
 8.结束刷新
 1> endRefreshing

结果竟然是没有写—(void)dealloc这个方法导致的

你可能感兴趣的:(libc++abi.dylib: terminate_handler unexpectedly threw an exception错误小结)