调用popViewControllerAnimated后EXC_BAD_ACCESS

时间:2010-08-20 13:03:18

标签: iphone exc-bad-access

我在视图控制器上调用dismissModalViewControllerAnimated后得到一个EXC_BAD_ACCESS。我的项目基于表视图启动项目,RootViewController创建一个这样的视图:

GobanVC *vc = [[GobanVC alloc] initWithNibName:@"GobanVC" bundle:[NSBundle mainBundle] coll:c];
[self.navigationController pushViewController:vc animated:YES];
[vc release];

在GobanVC.m中,我正在处理一个关闭视图的按钮:

- (IBAction) onDone:(id) sender;
{
    [self.navigationController popViewControllerAnimated:YES];
}

由于某种原因,GobanVC对象被过度释放。我运行了分配工具,当我调用alloc时,我可以看到引用计数设置为1,然后UIKit调用retain / release多次,然后处理上面的发布。之后,没有任何保留或释放来自我的代码,并且在popViewControllerAnimated之后,计数最终变为-1。

如果我把这个版本放在上面,那么事情似乎工作正常,所以看起来计数已经完全偏离了某个地方。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

可能GobanVC出了问题。你有实施吗?

因为如果UIKit发布的每个版本都有保留(应该有)。 而且你说你的呼叫也是平衡的(一个分配和一个释放)。

然后这意味着在GobanVC的实现中必定存在错误。

答案 1 :(得分:-1)

让我们算一下保留:

  1. Alloc使它成为1。
  2. 发布使其为0。
  3. 因此,当你调用pop时,堆栈中的内容将保留计数器等于0,这不是你想要的。如果您要么删除版本或保留它并将“vc”分配给定义为“retain”属性的实例变量,那么您将没事。

    根据您提供的代码,我可以看到以下内容:

    1. 根控制器创建GobanVC的实例。 GobanVC的保留计数为1.

    2. Root控制器将GobanVC实例推送到导航堆栈。我不确定push是否增加了保留计数。很可能是的。然后GobanVC实例的保留计数变为2.

    3. 您释放GobanVC实例,将其计数器设置为1.

    4. 您的按钮处理程序驻留在GobanVC中(不在根控制器中)。因此,GobanVC使用保留计数0从堆栈中弹出ITSELF(因为如果push增加计数器,pop将减少它)。这是一个问题。