【发布时间】:2011-06-26 15:59:22
【问题描述】:
重温!
感谢 Lone Gunman,这个问题是由于在释放之前没有将许多代表设置为 nil 的疏忽。
这是一个奇怪的...我熟悉基本的内存管理,但我认为我所看到的有些不寻常。这里有一点背景...
我有一个 NavigationController 来处理以下 ViewController 之间的导航:
首页 -> 游戏 -> 游戏
运行代码时,它会在离开游戏时掉落。在 GameViewController 中有一个 dealloc 方法,类似于:
- (void)dealloc
{
[board release];
[opponentsViewController release];
[instructionsViewController release];
[imgPicker release];
[gameView release];
[super dealloc];
}
当导航控制器返回到游戏列表(从游戏中)时,它会抛出一个 EXC_BAD_ACCESS。所以我调出我可信赖的分析器并检查僵尸。唉,正如我预期的那样,一条消息正在发送到一个已释放的对象!深入挖掘,我发现该对象的历史记录中有 3 个条目:
- Board 被分配(由 Game 的 init 方法调用)
- Board 被释放(由 Game 的 dealloc 方法调用)
- Board 被僵尸化(由 Game 的 dealloc 方法调用)
调用 2 和 3 都是从 UINavigationController setDisappearingViewController 调用的。
在我的 dealloc 方法中,我为每个释放调用设置断点,这样做时 - 发生 [board release] 调用,然后发生 [opponentsViewController release] 调用,然后再次发生 [board release] 调用。所以我看到 dealloc 方法没有完全完成并再次调用。
这可能是什么原因?
编辑:这是GameViewController Implementation
Games 控制器中添加此游戏的代码:
-(void) gotoGame:(int)tag {
game = [[GameViewController alloc] init];
[self.navigationController pushViewController:game animated:YES];
[game release];
}
【问题讨论】:
-
-[NSObject dealloc]不能执行两次。如果您在构建设置中启用“运行静态分析器”并尝试再次构建,您会遇到什么问题? -
当您多次调用 release 时会发生这种情况。你能检查一下你没有在程序的其他任何地方发布 Board 而不保留它吗?>
-
@WTP:静态分析器没有投诉。
-
你释放和保留董事会多少次?
-
编辑:添加 GameViewController 的实现文件
标签: objective-c ios ios4 memory-management