ios – 弹出ViewController时停止执行GCD

我在我的应用程序中有一个 – [tableView reloadData]方法,为了使执行更快,我在下面的方法中用GCD调用它.
dispatch_after(dispatch_time(DISPATCH_TIME_NOW,1.5 * NSEC_PER_SEC),dispatch_get_main_queue(),^{

    [tableView reloadData];
});

但是当我弹出我的viewController时,应用程序崩溃了这条消息[SecondViewController numberOfSectionsInTableView:]:消息被发送到解除分配的实例0x7fe376206e10.我假设在从ViewController退出后仍然执行[reloadData].我该如何停止执行?我应该把它变成NSOperation吗?如果是这样,我该怎么做?

解决方法

您的代码存在一些问题.以下是导致崩溃的事件序列

1)该块捕获tableView并使其保持活动状态.

2)然后你的视图控制器被pop弹出,

3)块执行,tableView调用它的数据源(你的视图控制器),现在已经解除分配.

你可以通过停止上面的#1或#3来解决这个问题.我建议#1. (我在这里假设ARC)

__weak UITableView *weakTableView = tableView;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW,^{
    [weakTableView reloadData];
});

如果这不起作用,其他东西可能会使tableView保持活跃状态​​.您应该调查究竟是在做什么,但您也可以通过阻止视图控制器dealloc方法中的#3来修复崩溃:

- (void)dealloc {
    self.tableView.dataSource = nil;
    self.tableView.delegate = nil;
}

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...