MBProgressHUD的使用,如何释放的问题

在它的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方法。

http://blog.csdn.net/yuri99/article/details/7282592

posted @ 2014-07-13 23:34  codeTao  阅读(780)  评论(0编辑  收藏  举报