在它的Demo里面写的比较简单,要释放的话都是通过在delegate中实现的。
demo中的函数是这样写的:
#pragma mark -
#pragma mark MBProgressHUDDelegate methods
- (void)hudWasHidden:(MBProgressHUD *)hud {
// Remove HUD from screen when the HUD was hidded
NSLog(@"hud was hidden");
[HUDremoveFromSuperview];
[HUD release];
HUD=nil;
}
1.手动调用show的方法,在结束的时候去执行hide
在我的程序里面有这么个情况,比如一个从一个navcontroller的根视图A中,push出一个视图控制B,这时候B开始加载数据,同时显示出HUD的进度。但是在进度还未执行完成的时候,我点击了返回A视图。这时候,B控制器会被释放掉。一个比较微妙的问题就容易在这个地方出现。
如果返回的瞬间,刚好加载完成,同时执行了一个
[HUD hide:YES afterDelay:3];
这样的函数,那么程序很可能就会挂掉了。
这里需要注意的是,hide方法中的YES,表示的是HUD的视图会以动画的方式渐变的消失掉。而起内部则会执行动画完成的回调函数,这时候selector的执行者如果已经被提前释放了就会导致程序挂掉。
解决办法,参数用NO表示不用动画,那么不会有问题。
另外我实验了下,在B视图控制器中的释放代码中,设定HUD的delegate为nil,就行了。
- (void)dealloc
{
HUD.delegate=nil;
self.HUD=nil;
[super dealloc];
}
在B释放的同时,就把HUD也释放掉,不知道这样做是否合理。这样HUD的hudWasHidden函数就不会再执行了。程序运行正常。
我看部分app在这种情况下,也有使用阻塞方式进行进度条的显示,就是说数据没有加载完毕,是点击不了返回按钮的。这种方式在demo中也有一个例子。
2.使用hud中的
[HUD showWhileExecuting:@selector(loadxmldata) onTarget:self withObject:nil animated:YES];
这会在HUD创建的一个新线程中执行loadxmldata的方法。
在遇到返回后,B视图控制器会等待子线程执行完毕,才会调用B自身的dealloc方法。