我在我的应用程序中有一个 – [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; }