重温!
感谢 Lone Gunman,这个问题是由于在释放之前没有将许多代表设置为零的疏忽。
这是一个奇怪的...我熟悉基本的内存管理,但我认为我所看到的有些不寻常。这里有一点背景...
我有一个 NavigationController 来处理以下 ViewControllers 之间的导航:
首页 -> 游戏 -> 游戏
运行代码时,它会在离开游戏时掉下来。在 GameViewController 中有一个 dealloc 方法,类似于:
- (void)dealloc
{
[board release];
[opponentsViewController release];
[instructionsViewController release];
[imgPicker release];
[gameView release];
[super dealloc];
}
当导航 Controller 返回到游戏列表(从游戏中)时,它会抛出一个 EXC_BAD_ACCESS。所以我调出我可信赖的分析器并检查僵尸。唉,正如我预期的那样,一条消息正在发送到一个已释放的对象!深入挖掘,我发现该对象的历史记录中有 3 个条目:
调用 2 和 3 都是从 UINavigationController setDisappearingViewController 调用的。
在我的 dealloc 方法中,我为每个发布调用设置断点,这样做时 - 发生 [board release] 调用,然后发生 [opponentsViewController release] 调用,然后再次发生 [board release] 调用。所以我看到 dealloc 方法没有完全完成并再次调用。
这可能是什么原因造成的?
编辑:这是 GameViewController Implementation
来自添加此游戏的 Games Controller 的代码:
-(void) gotoGame:(int)tag {
game = [[GameViewController alloc] init];
[self.navigationController pushViewController:game animated:YES];
[game release];
}
编辑:这是 GameViewController Header
最佳答案
我会尝试将所有 ivar 的代表设置为零(编辑:在 dealloc 中)。我在获取结果 Controller 时遇到了类似的问题。无法在 dealloc 中将其委托(delegate)设置为 nil,并且在释放 View Controller 时核心数据堆栈仍然有一个指向它的指针。
所以这是我的赌注,在 dealloc 中将 ivar 代表设置为 nil,尽管我看不到您的 header 以知道您确定符合哪些协议(protocol)。
编辑:解释
设置委托(delegate)实际上是给正在执行委托(delegate)的对象一个指针(我相信它通常是一个分配的属性)。
@property (assign) delegate;
我将以我遇到的问题为例。
所以假设你有一个 View Controller ,它有一个 fetchedResultsController 作为一个 ivar。当您设置 FRC 委托(delegate)时:
fetchedResultsController.delegate = self;
并且 View Controller 被释放,任何使用该指针的对象仍然认为它是事件的。你可能会想,既然 FRC 也在 dealloc 中发布,你会没事的(这就是为什么我花了 4 天时间才弄清楚这一点:)),但有时实现的其他部分也会使用你的委托(delegate)。所以解决方法是:
-(void)dealloc
{
self.fetchedResultsController.delegate = nil;
[_fetchedResultsController release];
[super dealloc];
}
注意:一旦所有人都可以使用新工具,您就不必再担心这些东西了^ ^;
关于objective-c - Dealloc 被调用两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6485023/