dismissViewControllerAnimated将消息发送到zombie对象

时间:2016-02-08 18:15:35

标签: ios objective-c xcode

我有两个UIViewController,VC1和VC2。 VC1有一个按钮,可以调用触发的Modal segue到VC2。此segue在故事板中定义。在VC2中,用户可以使用执行以下代码行的平移手势返回VC1:

[self.presentingViewController dismissViewControllerAnimated:YES completion:nil];

此代码已经工作了很长时间。然而,当这一行运行时,应用程序突然崩溃。我启用了僵尸对象,我可以看到这个错误:

  

- [VC2 retain]:发送到解除分配的实例0x7f843a81e200的消息

我已经运行了僵尸分析器,结果如下:

enter image description here

UIClassSwapper initWithCoder似乎是应用程序崩溃的地方,并且似乎有一个过度保留的对象,但我无法继续。当我设置一个异常断点时,我只是进入汇编代码,这不是任何明显的帮助。

所以,这里有几个问题。第一个是我在如何呈现和解雇这个视图控制器时做错了什么?在那之后,我不知道如何破解事件历史记录以弄清楚如何处理这个僵尸对象。

感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

您似乎使用ARC项目。请提供更多代码:
1.如何初始化presentViewController属性(并声明)。是(非原子的,强大的)? 2.如何将此ViewController放到屏幕上。它是一种模态视图控制器等吗?

- 评论后补充 基于ARC的项目会自动决定是否需要该对象,并自动将其从堆栈中删除。因此,避免此问题的唯一有用的方法是添加NSNotification观察者并一次又一次地发布通知。它将视图控制器保持在堆栈中并避免自动释放。
另一个解决方案 - 检查控制器是否仍在堆栈中:

    if (!self.presentingViewController) [[THECONTROLLER alloc] init];

第三个 - 使用一些对象将VC1和VC2声明为类变量,并在需要时将它们显示为模态视图控制器。在这种情况下,只要任何VC出现,对象及其变量就会保持不变。

在任何情况下,都会发生异常,因为ARC认为不再需要VC并自动释放它。