【发布时间】:2014-09-12 03:41:08
【问题描述】:
我有奇怪的行为。我的应用程序使用UINavigationController 启动。如果我推送视图控制器ANavigationController,返回并模拟内存警告一切正常。
如果我以同样的方式推送同一个视图控制器 (ANavigationController),返回并模拟内存警告 - 应用程序崩溃并出现错误:
[ANavigationController retain]:消息发送到已释放的实例。
在调试时,我打印了推送控制器的地址并释放了一个:
- 第一次推送时,推送的控制器地址是
0xDA724F0。 - 如果我返回并模拟内存警告 - 一切正常。
- 第二次推送 - 调用地址为
0xDA724F0的控制器的–dealloc方法。 - 新推送的控制器地址为
0xFA720F0。 - 返回并模拟内存警告崩溃并出现错误:
[ANavigationController retain]:消息发送到已释放的实例0xDA724F0。
编辑
我正在使用 ARC。
编辑
在运行 Instruments 以测试分配并启用 NSZombie 后,我在预期的地方崩溃了,但是在 UIkit 库中报告了 -1 引用计数,并且负责的调用者是:
+[UIViewController_traverseViewControllerHierarchyWithDelayedReleaseArray:block:]
【问题讨论】:
-
设置“所有异常”断点,看看抛出异常时堆栈上发生了什么。听起来你在某个地方有一个错误的指针,现在你只需要找到它。了解您是否使用 ARC 也会有所帮助,尽管如今几乎没有理由不使用。
-
你在 didReceieveMemoryWarning 中做什么?
-
什么都没有。只需调用 [super didReceieveMemoryWarning]。另外,为了消除代表可能出现的问题,我清除了我的所有课程并将其置于最简单的状态,我所做的只是为视图设置背景颜色。
-
你能给出这样的错误抛出的尽可能简单的例子吗?如果您已经实现了视图生命周期方法,请将它们粘贴在这里。
-
问题是,当我为自己创建这样的示例以测试简单的推送功能时,没有发生此错误。在我的项目中,我做了很多事情,比如子类化视图控制器和自定义导航栏,所以我不知道从哪里开始
标签: ios objective-c memory-management uinavigationcontroller automatic-ref-counting