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

时间:2011-03-22 20:51:51

标签: iphone ios memory-management delegates crash

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

这很好,除了用户仍然可以退出UITableViewController,如果他们认为它花了太长时间。当然,这是一件好事,除了当单独的线程结束其操作时,它仍然试图调用它的委托(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

2 个答案:

答案 0 :(得分:4)

从你的UITableViewController viewWillDisappear,viewDidDisappear或dealloc方法中,设置MBProgressHUD.delegate = nil;

答案 1 :(得分:0)

用户退出表控制器后,hud的delegate属性指向一个解除分配的对象(=一个可能包含任何内容的内存区域)。当计算线程结束并尝试向委托发送任何消息时,这会导致崩溃。

在表格视图控制器dealloc中,您必须将hud委托设置为nil