使用制表符控制器和MBProgressHUD在tableviews之间切换时崩溃

时间:2010-08-03 06:05:46

标签: iphone cocoa-touch uitableview exc-bad-access

我有两个表格视图。当我选择一个选项卡时加载一个,当我选择另一个选项卡时加载另一个选项卡。

我使用MBProgressHUD允许在标签之间快速切换,因为我使用Objective Resource从web中提取tableview数据源,这可能需要一点点。所以我抛出一个等待数据加载的HUD进度指示器。

这反过来让我可以在标签之间快速切换。但是......如果我做得足够快就会发生异常

EXC BAD ACCESS

使用NSZombiesEnabled我得到了这个: 2010-08-02 22:44:43.116电影巨星[962:8703] *** - [MBProgressHUD发布]:消息发送到解除分配的实例0x85490b0

在我的两个tableviews中,我使用了两个不同的自定义tableviewcells。

我的下一步调试是什么?

...所以我已经移动代码从我的viewWillAppear:viewDidLoad方法创建HUD:崩溃消失了。 // hud将显示视图上的所有输入(使用视图层次结构中可能的最高视图)

HUD = [[MBProgressHUD alloc] initWithView:self.view];

    //HUD.graceTime = 0.5;
    //HUD.minShowTime = 5.0;

    // Add HUD to screen
    [self.view addSubview:HUD];

    // Register for HUD callbacks so we can remove it from the window at the right time
    HUD.delegate = self;

    // Show the HUD while the provided method executes in a new thread
    [HUD showWhileExecuting:@selector(loadFilms) onTarget:self withObject:nil animated:YES];

然而这并没有真正解决我的问题,因为viewDidLoad只会在很长一段时间内发生,特别是在新的多任务处理时。每当tableview出现时,我都需要这个HUD来激活选择器。

为什么让它出现在viewWillAppear中是不正确的...是因为可以加载这么多而我只是继续分配对象? perhasp我应该在viewDidload中分配并触发

// Show the HUD while the provided method executes in a new thread
        [HUD showWhileExecuting:@selector(loadFilms) onTarget:self withObject:nil animated:YES];

仅在我的viewWillAppear:?

Thoughts?

1 个答案:

答案 0 :(得分:0)

找到您初始化/保留/释放/自动释放MBProgressHUD实例的所有位置。

NSZombie告诉该项目在被解除分配后收到release消息(保留计数为零)。

如果你发布一些代码会有所帮助 - 否则你很难帮助你......

修改的:
正如您在编辑中提到的那样,如果您每个视图控制器只启动一次HUD(例如在viewDidLoad中)并且每次需要时调用showWhileExecuting(例如在viewWillAppear中),那就更好了。

但它仍然没有解释崩溃。

您从视图控制器的同一实例执行了您已经发布的所有代码(按原样)几次,那么您应该有内存泄漏。那是因为我没有看到你在哪里发布旧的HUD实例。

此外,您最好在发布之前将HUD的delegate设置为nil,然后在视图的[super dealloc];方法中调用dealloc之前控制器。

最后一个可能会导致EXC BAD ACCESS错误。

还有一件事,如果您发布的整个代码被执行多次,那么您在self.view下也应该只有少量HUD视图。
我不知道HUD在后台做了什么 - 也许这会导致错误......