objective-c - Dealloc 被调用两次?

标签 objective-c ios ios4 memory-management

重温!

感谢 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 个条目:
  • 棋盘被分配(由 Game 的 init 方法调用)
  • 棋盘被释放(由 Game 的 dealloc 方法调用)
  • 棋盘被僵尸化(由 Game 的 dealloc 方法调用)

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

    相关文章:

    objective-c - iPad 上的 iAd : Landscape iAd not Oriented Correctly

    ios - 场景更改后音乐停止播放 SKAudioNode Xcode 8

    events - UIButton在编码阶段的事件 Hook 内部修饰?

    ios - 当 ios 中该部分数据为空时,我如何删除 uitableview 部分?

    ios - 钥匙串(keychain)数据未存储在 iCloud 中

    ios - 快速切换ViewController,使用未解析的标识符

    ios - 处理背景图像的不同 iphone 屏幕尺寸/分辨率

    iphone - 将两个 SQLite 存储合并为一个

    iphone - CLLocationManager 从不调用委托(delegate)方法

    iphone - EKAlarm/EKEvent