解决!
感谢孤独枪手,这个问题是由于在释放许多代表之前没有将其设置为零而造成的。
这是一个奇怪的......我熟悉基本的内存管理,但我认为我所看到的有些不寻常。这是一些背景...
我有一个 NavigationController 来处理以下 ViewController 之间的导航:
首页 -> 游戏 -> 游戏
当运行代码时,它会在离开游戏时掉落。 GameViewController 中有一个 dealloc 方法,类似于:
- (void)dealloc
{
[board release];
[opponentsViewController release];
[instructionsViewController release];
[imgPicker release];
[gameView release];
[super dealloc];
}
当导航控制器返回游戏列表(从游戏)时,它会抛出 EXC_BAD_ACCESS。所以我打开我值得信赖的分析器并检查僵尸。唉,正如我预期的那样,一条消息被发送到一个已释放的对象!深入挖掘后,我发现该对象的历史记录中有 3 个条目:
- 棋盘被分配(由游戏的 init 方法调用)
- 棋盘被释放(由游戏的 dealloc 方法调用)
- 棋盘被僵尸化(由游戏的 dealloc 方法调用)
调用 2 和 3 都是从 UINavigationController setDisappearingViewController 调用的。
在我的 dealloc 方法中,我为每个释放调用设置断点,这样做时 - 发生 [board release] 调用,然后发生 [opponentsViewController release] 调用,然后再次发生 [board release] 调用。所以我看到 dealloc 方法没有完全完成并再次调用。
可能是什么原因造成的?
编辑:这是GameViewController 实现 https://gist.github.com/84f1e1026d4201fa6bc1
来自添加此游戏的游戏控制器的代码:
-(void) gotoGame:(int)tag {
game = [[GameViewController alloc] init];
[self.navigationController pushViewController:game animated:YES];
[game release];
}
编辑:这是游戏视图控制器头 https://gist.github.com/32a13d2b1a95fe0f7ee5