喜欢!
感谢Lone Gunman,此问题是由于疏忽导致在释放多位代表之前不将其设置为nil。
这是一个奇怪的...我熟悉基本的内存管理,但是我认为我所看到的东西有些不寻常。这是一些背景...
我有一个NavigationController处理以下ViewController之间的导航:
主页->游戏->游戏
运行代码时,它在离开游戏时会掉落。在GameViewController中,有一个类似于以下内容的dealloc方法:
- (void)dealloc
{
[board release];
[opponentsViewController release];
[instructionsViewController release];
[imgPicker release];
[gameView release];
[super dealloc];
}
当导航控制器回到游戏列表(从游戏中)时,它将引发EXC_BAD_ACCESS。因此,我调出了可信赖的探查器并检查了僵尸。 las,正如我期望的那样,消息将发送到已释放对象!深入研究,我发现对象的历史记录中有3个条目:
调用2和3都从UINavigationController setDisappearingViewController调用。
在我的dealloc方法中,我为每个release调用设置了断点-进行[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
最佳答案
我会尝试将所有ivar的代表都设置为nil(编辑:在dealloc中)。我对提取的结果控制器也遇到了类似的问题。释放视图控制器时,未能在dealloc中将其委托设置为nil,并且核心数据堆栈仍具有指向它的指针。
所以这是我的赌注,尽管我看不到您的标头知道您要遵循的协议,但是在dealloc中将ivar委托设置为nil。
编辑:解释
设置委托实际上是为执行委托的对象提供一个指针(我相信通常是分配的属性)。
@property (assign) delegate;
我将以我遇到的问题为例。
因此,假设您有一个具有fetchedResultsController作为ivar的视图控制器。设置FRC委托时:
fetchedResultsController.delegate = self;
并且视图控制器被释放,使用该指针的任何对象仍然认为它是 Activity 的。您可能会认为,因为FRC也将在dealloc中释放,所以您会很好的(这就是为什么我花了4天的时间才能解决这个问题:)),但是有时实现的其他部分也会使用您的委托。因此解决方法是:
-(void)dealloc
{
self.fetchedResultsController.delegate = nil;
[_fetchedResultsController release];
[super dealloc];
}
注意:只要新工具可供所有人使用,您就不必再为这些东西而烦恼^ ^ ;;
关于objective-c - Dealloc被称为两次?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6485023/