Resold!被称为两次的Dealloc?
感谢Lone Gunman,这个问题是由于在发布它们之前没有将许多代表设置为零的疏忽。
这是一个奇怪的...我熟悉基本的内存管理,但我认为我看到的东西是不寻常的。这里是一个小背景...
我有一个NavigationController,处理以下ViewControllers之间导航:
首页 - >游戏 - >游戏
运行代码时离开时摔倒游戏。内GameViewController有一个类似于dealloc方法:
- (void)dealloc
{
[board release];
[opponentsViewController release];
[instructionsViewController release];
[imgPicker release];
[gameView release];
[super dealloc];
}
当导航控制器返回到游戏列表(从游戏中),它抛出一个EXC_BAD_ACCESS。所以我提出了我可靠的剖析器并检查僵尸。唉,就像我预料的那样,一条消息正在发送到一个释放对象!进一步挖掘我发现那里是在对象的历史记录3项:
- 局取得alloc'd(通过游戏的init方法调用)
- 局得到释放(通过游戏的dealloc方法调用)
- 局之中Zombie'd(由Game的dealloc方法调用)
这两个调用2和3都是从UINavigationController setDisappearingViewController中调用的。
在我的dealloc方法中,我为每个释放调用设置了断点,这时会发生[board release]调用,然后发生[opponentsViewController release]调用,然后再次发生[board release]调用。所以我看到dealloc方法没有完成并再次调用。
什么可能导致这种情况?
编辑:这是GameViewController Implementation
从游戏控制器代码,增加了本场比赛:
-(void) gotoGame:(int)tag {
game = [[GameViewController alloc] init];
[self.navigationController pushViewController:game animated:YES];
[game release];
}
编辑:这是GameViewController Header
' - [NSObject dealloc]'不能执行两次。如果您在构建设置中启用“运行静态分析器”并尝试再次构建,您会遇到什么问题? – 2011-06-26 16:01:25
当您多次调用发布时会发生这种情况。你能检查你没有在程序的其他任何地方发布主板吗?> – sumderungHAY
@ WTP:没有来自静态分析器的投诉。 – Brent