在我的应用程序中,我有一个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
。
答案 0 :(得分:4)
从你的UITableViewController viewWillDisappear,viewDidDisappear或dealloc方法中,设置MBProgressHUD.delegate = nil;
答案 1 :(得分:0)
用户退出表控制器后,hud的delegate属性指向一个解除分配的对象(=一个可能包含任何内容的内存区域)。当计算线程结束并尝试向委托发送任何消息时,这会导致崩溃。
在表格视图控制器dealloc
中,您必须将hud委托设置为nil
。