我在视图控制器上调用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。
如果我把这个版本放在上面,那么事情似乎工作正常,所以看起来计数已经完全偏离了某个地方。
有什么想法吗?
答案 0 :(得分:0)
可能GobanVC
出了问题。你有实施吗?
因为如果UIKit发布的每个版本都有保留(应该有)。 而且你说你的呼叫也是平衡的(一个分配和一个释放)。
然后这意味着在GobanVC
的实现中必定存在错误。
答案 1 :(得分:-1)
让我们算一下保留:
因此,当你调用pop时,堆栈中的内容将保留计数器等于0,这不是你想要的。如果您要么删除版本或保留它并将“vc”分配给定义为“retain”属性的实例变量,那么您将没事。
根据您提供的代码,我可以看到以下内容:
根控制器创建GobanVC的实例。 GobanVC的保留计数为1.
Root控制器将GobanVC实例推送到导航堆栈。我不确定push是否增加了保留计数。很可能是的。然后GobanVC实例的保留计数变为2.
您释放GobanVC实例,将其计数器设置为1.
您的按钮处理程序驻留在GobanVC中(不在根控制器中)。因此,GobanVC使用保留计数0从堆栈中弹出ITSELF(因为如果push增加计数器,pop将减少它)。这是一个问题。