【问题标题】:popToRootViewController is crashing when more than two view controllers are being popped当弹出两个以上的视图控制器时,popToRootViewController 崩溃
【发布时间】:2011-08-15 18:54:10
【问题描述】:

我在导航控制器上调用 popToRootViewController 时遇到了一个奇怪的情况。如果根顶部只有一两个视图控制器要弹出,它就可以正常工作。如果堆栈的根顶部有两个以上的视图控制器,它就会崩溃。我查看了该站点和其他站点上的所有 popToRootViewController 投诉,并尝试将动画设置为 NO。这无济于事。我还看到一些人在非常老的帖子上引用了带有 popToRootViewController 的 iOS 3.0 的问题,但我正在使用 iOS 4.0 进行开发。

更明确地说,如果我的堆栈如下所示:RootVC --> VC1 --> VC2。然后我做

[self.navigationController popToRootViewControllerAnimated:NO];

从 VC2 中,它按预期弹出到根目录。但是,如果我的堆栈如下所示:RootVC --> VC1 --> VC2 --> VC3 然后从 VC3 执行相同的操作,它就会崩溃。关于可能是什么问题的任何线索?如果这是一个非常愚蠢的问题,我深表歉意。我是 iPhone 开发的新手。

我正在使用以下代码将我的每个视图推送到堆栈中:

-(void)pushViewNamed:(NSString *)viewname 
{
    iOvulate_3AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];

    NSString *viewControllerName=viewname;
    UIViewController *targetViewController=[[NSClassFromString(viewControllerName) alloc] initWithNibName:viewControllerName bundle:nil];

    [self.navigationController pushViewController:targetViewController animated:YES];

    if ( [appDelegate.pdbool intValue] == 0 )
    {
        [viewControllerName release];
        [targetViewController release];
    }
}

我将条件释放放在那里,因为它解决了我遇到的另一个问题,即堆栈上第三个视图之外的任何视图上的 IBActions 都不起作用——因为触摸按钮内部会导致消息发送到一个 nil 对象,它应该是视图控制器(或类似的东西?)并导致 EXC_BAD_ACCESS 错误。这个“修复”是否会导致您所说的内存管理问题?

【问题讨论】:

  • 可能有多种原因,但可能是内存管理错误。您能否发布一些代码并向我们展示错误消息的内容?
  • 我不知道你的修复是否是这个问题的根源,但它肯定没有正确管理内存。您应该始终释放 targetViewController,因为您使用 alloc 创建了它,将其添加到 navigationController,并在此时完成了它。您应该在此方法中释放 viewControllerName,因为您将它分配到其他地方并且可能仍在使用它。
  • @DrewC:添加到导航控制器后释放 targetViewController 会导致我的旧问题再次出现,即当我释放 targetViewController 时,堆栈中第三个视图之外的任何视图中的 IBAction 都不起作用。我目前有一个零代表。这可能是问题吗?
  • 您的代码中是否还有其他地方可以释放添加到导航控制器的视图控制器?

标签: iphone uinavigationcontroller


【解决方案1】:

您为什么不尝试查看导航堆栈上的每个视图控制器?使用:

[self.navigationController.viewControllers objectAtIndex:index];

在相应的index 处查看视图控制器。如果它们看起来都很好,那么一定是代码中的其他东西导致了崩溃。希望对您有所帮助!

【讨论】:

  • 这很有帮助!似乎在我将第四个视图推入堆栈后,它会将所有内容都扔掉——就像从堆栈上的第三个视图调用的 self.navigationController.viewControllers 一样,按预期返回一个包含三个视图控制器的数组,但从我的第四个视图调用它view 返回一个由零视图控制器组成的数组。我想我使用了太多内存?
  • 可能你使用了太多内存。使用工具查看后台发生的情况。网上有很多教程会告诉你如何使用它们。另外,不要忘记接受答案,以便人们以后遇到类似问题时可以使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-05
  • 2011-11-08
  • 2012-03-11
  • 1970-01-01
  • 1970-01-01
  • 2017-04-10
相关资源
最近更新 更多