喜欢!

感谢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个条目:
  • 董事会获得分配(通过Game的init方法调用)
  • 董事会发布(由Game的dealloc方法调用)
  • 董事会被僵死(通过Game的dealloc方法调用)

  • 调用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/

    10-13 04:55