Sid*_*Dev 7 objective-c grand-central-dispatch ios
我-[tableView reloadData]在我的应用程序中有一个方法,并使执行更快,我已通过以下方法在GCD中调用它.
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1.5 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[tableView reloadData];
});
Run Code Online (Sandbox Code Playgroud)
但是当我弹出我的viewController时,应用程序崩溃了这条消息[SecondViewController numberOfSectionsInTableView:]: message sent to deallocated instance 0x7fe376206e10.我假设[reloadData]在从ViewController退出后仍然执行.我该如何停止执行?我应该把它变成NSOperation吗?如果是这样,我该怎么做?
您的代码存在一些问题。以下是导致崩溃的事件顺序
1) 该块捕获 tableView 并使其保持活动状态。
2) 然后你的视图控制器被 pop 释放,
3) 该块执行,并且 tableView 调用它的数据源(您的视图控制器),该数据源现在已被释放。
您可以通过停止上面的 #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];
});
Run Code Online (Sandbox Code Playgroud)
如果这不起作用,则可能有其他原因使 tableView 保持活动状态。您应该调查究竟是什么在执行此操作,但您也可以通过阻止视图控制器方法中的 #3 来修复崩溃dealloc:
- (void)dealloc {
self.tableView.dataSource = nil;
self.tableView.delegate = nil;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
727 次 |
| 最近记录: |