最近做项目 遇到一个很奇葩的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];
});
}
}
特此,写下记录之,以解大家之惑!!