【问题标题】:iOS UIViewController deallocating itself?iOS UIViewController 自行释放?
【发布时间】:2010-09-15 15:47:17
【问题描述】:

iPhone 应用程序中的奇怪问题。

我的应用程序的主视图是 View A,它是一个选项卡控制器。特别是一个选项卡被设置为加载视图 B。当您单击按钮时,视图 B 以模态方式显示视图 C。视图 C 又具有一个按钮,当按下该按钮时,会向其委托(视图 B 的视图控制器)发送消息,然后代理关闭视图 C。

现在,我的理解是视图 A 始终持有对视图 B 的引用。是吗?

顺序如下:

  1. 选择选项卡以显示视图 B。
  2. 按下按钮显示视图 C(模态)。
  3. 按下按钮关闭 - 视图 C 发送消息,视图 B 的控制器执行关闭。现在显示视图 B。
  4. 重复步骤 2-3 两次。
  5. 视图 B 的视图控制器解除分配(我在 dealloc 中有一个 NSLog,所以我知道这正在发生)。视图仍然显示。
  6. 按下按钮显示视图C,得到“EXC_BAD_ACCESS”,因为视图B的视图控制器已被释放,所以按钮的“点击”消息无处可去。

在任何时候都不会出现内存警告 - 我已将 NSLog 放入以确保它。 View A 和 View B 都是在 Interface Builder 中构建的,而不是在代码中,而且我绝对没有编写过会调用 View B 的 dealloc 方法的代码。

这总是发生在恰好重复 3 次之后。

作为参考,按钮本身是在视图 B 的 viewWillAppear 方法中以编程方式构造的。这是sn-p:

    // create button
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.frame = CGRectMake(column*100+24, row*80+10, 64, 64);
    [button setImage:thumb forState:UIControlStateNormal];
    [button addTarget:self 
                    action:@selector(buttonClicked:) 
        forControlEvents:UIControlEventTouchUpInside];

所以按钮应该向视图 B 的视图控制器发送“buttonClicked”消息。前三次效果很好,在视图控制器神秘地释放后停止工作。

视图 B 应该永远解除分配,因为它是显示在应用程序标签栏中的顶级视图。

任何想法我可以从哪里开始解决这个问题?

编辑:有趣的琐事。我在视图 B 的 viewDidLoad 中添加了一个 [self retain],这应该会增加对象的保留计数。确实如此:在获得 EXC_BAD_ACCESS 之前,我现在可以执行上述过程四次。我正在使用 NSZombiesEnabled 运行,所以我知道视图 B 的控制器正在被释放。我只需要弄清楚它的保留计数在哪里减少,因为我实际上并没有编写任何这样做的代码。

我知道视图 A 应该增加视图 B 的保留计数;当视图 B 随后模态显示视图 C 时,不应该减少计数,不是吗?

【问题讨论】:

  • 您是否在这两个视图中正确发布了所有其他内容?另外,您能否发布一些与您如何创建/关闭这些视图相关的代码?

标签: ios memory-management


【解决方案1】:

没有看到代码就不能说,但如果我猜的话:

  1. 在第三步中,当您关闭视图控制器 C,而不是释放视图控制器 C 时,您不小心释放了 B。错误需要一段时间才能显示出来,因为 B 上有多个来自其他对象的保留。但是,每次释放 C 时,都会减少释放计数,直到达到零。
  2. 您在某处有一个自定义访问器,例如 C 的委托属性,它在访问时向 B 发送释放。与 (1) 相同的模式。

我建议您在发布时进行项目搜索并检查所有发布以查看是否有 B。标准设置中不应有明确的 B 发布。

您还可以覆盖 B 的 release 方法以记录它何时发布(不要忘记调用 super),这将显示发布何时发生,让您了解它们发生的位置。

【讨论】:

    猜你喜欢
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 2014-09-12
    • 2012-07-23
    • 1970-01-01
    • 2012-01-18
    相关资源
    最近更新 更多