iOS pop返回时崩溃

释放双眼,带上耳机,听听看~!

最近做项目 遇到一个很奇葩的bug,在popViewControllerAnimated  时莫名发生crash,报的错就是发生了EXC_BAD_ACCESS  即,控制器释放了 却还在调用里面的方法,后来试过了

 if ([NSThread isMainThread]) {
[self.navigationController popViewControllerAnimated:YES];
} else {
dispatch_async(dispatch_get_main_queue(), ^{
[self.navigationController popViewControllerAnimated:YES];
});
}

 

结果还是崩溃,困扰很久,后来经过仔细调试,发现需要在pop前将代理都置为空,即xx.delegate = nil;(这里是tabview或scroview),然后在执行pop代码。根本原因是在pop动画时,scroview或tableview被释放了,但是他们仍会将一些信息传递给代理(例如scroview时的滚动),这时候就会导致访问了已释放的内存。

完整代码例子如下:

#pragma mark 返回
- (void)backClick
{
// pop动画时,将代理置空(tableview,scroview)
self.webV.scrollView.delegate = nil;
if ([NSThread isMainThread]) {
[self.navigationController popViewControllerAnimated:YES];
} else {
dispatch_async(dispatch_get_main_queue(), ^{
[self.navigationController popViewControllerAnimated:YES];
});
}
}

 

特此,写下记录之,以解大家之惑!!

人已赞赏
iOS文章

iOS UICollectionView section的头视图 复用BUG解决

2020-2-24 16:44:19

iOS文章

iOS UILabel高度自适应终结篇

2020-2-24 18:56:44

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索