当用户退出 UITableView 且 MBProgressHUD 在单独的线程中运行时,iPhone 应用程序崩溃

标签 iphone ios memory-management delegates crash

在我的应用程序中,我有一个 UITableViewController,它从我的核心数据存储加载计算数据。这可能需要相当长的时间并挂起主线程,因此为了给用户视觉反馈,我安装了 MBProgressHUD 小部件,它将显示进度指示器(只是旋转轮),而计算方法在单独的线程中运行。

这很好,除了如果用户认为它花费的时间太长,他们仍然可以退出 UITableViewController。当然,这是一件好事,除了当单独线程结束其操作时,它仍会尝试调用其委托(delegate)(UITableViewController)来隐藏 MBProgressHUD。这会导致崩溃,因为由于用户已经退出了 UITableViewController,它有 deallocrelease 自己。

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/

相关文章:

iphone - 有权在 AppStore 上销售付费应用程序的国家/地区列表

iphone - UITextField 验证

c# - 如何在.NET中处理COM对象的事件时释放所有COM对象

ios - 如何使用终端使用 xCode 命令行工具?

IOS UISlider非连续近似值

c - 如何在 linux 内核中导出 init_mm

ios - 如何正确释放UIPopoverController?

iphone - HTML 按钮中的空白无法删除且仅显示在 iPhone 上?

ios - 在 ScrollView iOS sdk 中缩放图像

ios - 在 Xcode 6 Storyboard中制作 ScrollView