2010-08-20 24 views
0

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

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调用保留/释放一堆次,然后处理上面的版本。在那之后,没有保留或释放来自我的代码,并且在popViewControllerAnimated之后,计数最终变为-1。

如果我将上面的版本发布出来,事情似乎可以正常工作,所以看起来count在某个地方只有一个。

任何想法?

+1

在我的视图控制器上调用dismissModalViewControllerAnimated之后,我得到一个EXC_BAD_ACCESS。你为什么在开始时说关于解雇,然后你的代码是popViewController,你确定它是正确的吗? – vodkhang 2010-08-20 14:52:33

回答

0

也许GobanVC有什么问题。你有执行它吗?

因为如果UIKit所做的每个发布都有一个保留(应该有)。 而你说你的通话也是平衡的(一个分配和一个释放)。

那么这意味着在执行GobanVC时一定有什么问题。

-1

让我们来算保留:

  1. 的Alloc使得1.
  2. 释放使得0

那么,什么出来堆的,当你调用栈会已保持计数器等于0,这不是你想要的。如果你删除版本或保留它,并将“vc”分配给一个定义为“retain”属性的实例变量,那么你会没事的。

从你的代码提供,我可以看到以下内容:

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

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

  3. 松开GobanVC实例,其计数器设置为1

  4. 你的按钮处理程序驻留在GobanVC(不在根控制器)。所以,GobanVC从栈中弹出自己的保留计数为0(因为如果推动增加计数器,弹出将减少它)。这是个问题。

+0

你的假设是正确的:推送一个视图控制器会发送一个'retain'消息,并且popping会发送一个'release'。但是,如果保留计数在'onDone'中达到零,我不认为这是个问题。 'popViewControllerAnimated:'消息将被发送,该函数将退出,并且在那一点上视图控制器不再需要。 – 2010-08-20 17:20:12

+0

也许是,也许不是。取决于前后发生的情况以及基础对象管理如何工作。你知道这些细节吗?我不。至少我甚至不会尝试从物体内部创造自杀条件。根据我的经验,这种浮动不确定性(在我完成之前存活或死亡?)是非常难以捕捉并且随时可能随机出击的错误类型。 – spbfox 2010-08-20 17:54:14

相关问题