我的应用程序中有一个-[tableView reloadData]
方法,为了提高执行速度,我在以下方法的GCD中调用了它。
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1.5 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[tableView reloadData];
});
但是,当我弹出viewController时,应用程序崩溃,并显示以下消息
[SecondViewController numberOfSectionsInTableView:]: message sent to deallocated instance 0x7fe376206e10
。我假设从该ViewController退出后[reloadData]
仍在执行。如何停止执行?我应该把它变成NSOperation吗?如果是这样,我将如何做? 最佳答案
您的代码有两个问题。这是导致崩溃的事件顺序
1)该块捕获tableView并使其保持 Activity 状态。
2)然后,弹出窗口将您的 View Controller 释放,
3)执行该块,然后tableView调用它的数据源(您的 View Controller ),该数据源现在已释放。
您可以通过停止上面的#1或#3来解决此问题。我建议#1。 (我在这里假设是ARC)
__weak UITableView *weakTableView = tableView;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1.5 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[weakTableView reloadData];
});
如果这不起作用,则可能有其他原因使tableView保持 Activity 状态。您应该调查到底是什么在做,但是您也可以通过防止 View Controller 的
dealloc
方法阻止#3来解决崩溃问题:- (void)dealloc {
self.tableView.dataSource = nil;
self.tableView.delegate = nil;
}
关于ios - 弹出ViewController时,停止执行GCD,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30092100/