在自定义UIViewController上调用[super dealloc]时的iPhone EXC_BAD_ACCESS

Sal*_*uts 3 iphone dealloc

我很茫然!这是仅在特定条件下发生的那些讨厌的错误之一,但我无法直接链接条件和结果.

我的应用程序有一个分页的UIScrollView,其中每个页面的视图来自一个MyViewController,一个UITableViewController的子类.为了最小化内存使用量,我卸载那些当前不可见的控制器.这是我的"清洁"方法:

- (void) cleanViewControllers:(BOOL)all {

    if (all) { 
    // called if some major changes occurred and ALL controllers need to be cleared

        for (NSInteger i = 0; i < [viewControllers count]; i++)
            [viewControllers replaceObjectAtIndex:i withObject:[NSNull null]];
    }
    else if ([viewControllers count] > 2) {
    // called if only the nearest, no longer visible controller need to be cleared
        NSInteger i = pageControl.currentPage - 2;
        if (i > -1) [viewControllers replaceObjectAtIndex:i withObject:[NSNull null]];
        i = pageControl.currentPage + 2;
        if (i < [viewControllers count]) [viewControllers replaceObjectAtIndex:i withObject:[NSNull null]];
    }
}
Run Code Online (Sandbox Code Playgroud)

这条线崩溃了应用程序:

viewControllers replaceObjectAtIndex:i withObject:[NSNull null]];
Run Code Online (Sandbox Code Playgroud)

viewControllers是一个NSMutableArray,包含MyViewController类型的对象.MyViewController没有自定义属性,其dealloc方法只包含[super dealloc]调用.

以下是调试器显示的内容: alt text http://a.imageshack.us/img831/3610/screenshot20100806at126.png

问题是,每次清除控制器时都不会发生这种情况,但有时只会发生.具体来说,在某些更改触发完全清理并重新绘制ScrollView后,它会显示当前页面(称为X),但是只要我滚动到足以导致X的清理,就会发生此崩溃.这让我疯了!

另一件事,这不会发生在4.0模拟器中,也不会发生在iPad上,而是在运行3.1.3的第一代iPod touch上非常一致.

Joh*_*lin 6

有些东西正在被释放,但指针仍悬空.将NSZombieEnabled设置为YES并再次运行它.这是如何做:

  • 产品 - >编辑方案
  • 选择"参数"选项卡
  • 添加到"要在环境中设置的变量"
    • 名称:NSZombieEnabled
    • 价值:是的

在Xcode 4.1及以上版本中:

  • 产品 - >编辑方案
  • 选择"诊断"选项卡
    • 您可以选择启用僵尸对象.

再次运行该应用程序.在某些时候它会告诉你你正在访问已经发布的对象.从那里你需要弄清楚谁不保留或谁过度释放对象.

快乐的僵尸狩猎.

  • 僵尸狩猎?听起来很有趣!谢谢你的建议. (2认同)