【发布时间】: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