【问题标题】:iOS memory warning sent to deallocated UIViewControlleriOS 内存警告发送到释放的 UIViewController
【发布时间】:2014-09-12 03:41:08
【问题描述】:

我有奇怪的行为。我的应用程序使用UINavigationController 启动。如果我推送视图控制器ANavigationController,返回并模拟内存警告一切正常。

如果我以同样的方式推送同一个视图控制器 (ANavigationController),返回并模拟内存警告 - 应用程序崩溃并出现错误:

[ANavigationController retain]:消息发送到已释放的实例。

在调试时,我打印了推送控制器的地址并释放了一个:

  1. 第一次推送时,推送的控制器地址是0xDA724F0
  2. 如果我返回并模拟内存警告 - 一切正常。
  3. 第二次推送 - 调用地址为 0xDA724F0 的控制器的 –dealloc 方法。
  4. 新推送的控制器地址为0xFA720F0
  5. 返回并模拟内存警告崩溃并出现错误:

    [ANavigationController retain]:消息发送到已释放的实例0xDA724F0

为什么解除分配的控制器(在步骤 4 中)会收到内存警告消息?

编辑

我正在使用 ARC。

编辑

在运行 Instruments 以测试分配并启用 NSZombie 后,我在预期的地方崩溃了,但是在 UIkit 库中报告了 -1 引用计数,并且负责的调用者是:

+[UIViewController_traverseViewControllerHierarchyWithDelayedReleaseArray:block:]

【问题讨论】:

  • 设置“所有异常”断点,看看抛出异常时堆栈上发生了什么。听起来你在某个地方有一个错误的指针,现在你只需要找到它。了解您是否使用 ARC 也会有所帮助,尽管如今几乎没有理由不使用。
  • 你在 didReceieveMemoryWarning 中做什么?
  • 什么都没有。只需调用 [super didReceieveMemoryWarning]。另外,为了消除代表可能出现的问题,我清除了我的所有课程并将其置于最简单的状态,我所做的只是为视图设置背景颜色。
  • 你能给出这样的错误抛出的尽可能简单的例子吗?如果您已经实现了视图生命周期方法,请将它们粘贴在这里。
  • 问题是,当我为自己创建这样的示例以测试简单的推送功能时,没有发生此错误。在我的项目中,我做了很多事情,比如子类化视图控制器和自定义导航栏,所以我不知道从哪里开始

标签: ios objective-c memory-management uinavigationcontroller automatic-ref-counting


【解决方案1】:

我不确定这是解决问题的方法还是解决方法,但为此特定文件禁用 ARC 可以解决此问题。当然,我必须自己去管理记忆。

我仍然会感谢任何关于问题所在的线索。

编辑

找到了解决方案。请看我对另一个问题的回答:[UINavigationController retain]: message sent to deallocated instance

【讨论】:

    猜你喜欢
    • 2012-07-05
    • 1970-01-01
    • 2015-02-22
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    相关资源
    最近更新 更多