在我的应用程序中,我有一个 UITableViewController,它从我的核心数据存储加载计算数据。这可能需要相当长的时间并挂起主线程,因此为了给用户视觉反馈,我安装了 MBProgressHUD 小部件,它将显示进度指示器(只是旋转轮),而计算方法在单独的线程中运行。
这很好,除了如果用户认为它花费的时间太长,他们仍然可以退出 UITableViewController。当然,这是一件好事,除了当单独线程结束其操作时,它仍会尝试调用其委托(delegate)(UITableViewController)来隐藏 MBProgressHUD。这会导致崩溃,因为由于用户已经退出了 UITableViewController,它有 dealloc
和 release
自己。
MBProgressHUD 有以下代码试图阻止它:
if(delegate != nil && [delegate conformsToProtocol:@protocol(MBProgressHUDDelegate)]) {
if([delegate respondsToSelector:@selector(hudWasHidden)]) {
[delegate performSelector:@selector(hudWasHidden)];
}
}
但是,我的应用似乎仍在运行此内部代码 ([delegate performSelector:@selector(hudWasHidden)]
),即使 UITableViewController 已完全消失——导致应用崩溃。
有什么建议吗?我没有使用 NSZombiesEnabled
运行。
最佳答案
从您的 UITableViewController viewWillDisappear、viewDidDisappear 或 dealloc 方法中,设置 MBProgressHUD.delegate = nil;
关于当用户退出 UITableView 且 MBProgressHUD 在单独的线程中运行时,iPhone 应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5397687/