UIKit消息在iOS 6上的segue期间释放了对象

时间:2012-10-16 10:38:55

标签: cocoa-touch ios6

升级xcode并使用iOS 6 SDK编译我的应用后,我在应用中遇到了很多崩溃。从我能够追踪到的,它看起来像UIKit消息在模态segue期间取消分配视图控制器而不是新创建的。这是它的外观:

我有一个显示导航控制器的Tabbar控制器。导航控制器呈现的另一个视图控制器显示模态视图控制器。

TabbarController - > NavigationController - > ViewController(呈现) -                                                               |显示使用模态segue |                                                                - > ViewController(已提交)

导致崩溃的步骤:

  1. 访问上面显示的层次结构中的View Controller(显示)。它不是根视图cntrl而是更高。
  2. 将segue触发到模态视图控制器。
  3. 从标签栏中选择一个标签(以较小者为准)并返回相同的视图控制器(显示)。选择一个选项卡会在导航控制器上调用popToRoot。
  4. 再次触发视图控制器(显示)的模态segue
  5. 崩溃:僵尸对象 - 视图控制器(显示) - 收到消息
  6. 为什么呢? 看起来在以前的iOS上调用popToRoot并且正在清理View Controller(呈现)时,模态视图也被破坏了。因此,当它再次被访问时,它被重新创建并呈现。 在iOS 6上,Allocations Instrumentation显示模态视图与之一起被销毁 查看控制器(演示)。但是当由于某种原因被访问时,UIKit会创建一个新的modav视图控制器,但随后会发送旧的不再存在的控制器。没有意义。

    让我怀疑的另一件事是,在iOS 5上,Allocations Instrumentation工具从未向我显示保持计数= 0的视图控制器(显示),但iOS 6确实(之后它使其为-1)。

    我知道这可能是一个非常难以帮助我的问题,但也许有人已经在处理iOS 6和这些细分问题?

    从Allocations Instrumentation工具我可以看出iOS 6中segues的实现已经发生了很多变化。

1 个答案:

答案 0 :(得分:1)

我最终实现了自定义segue来呈现这些模态视图。这似乎是个好主意。 也许不应该在标签栏视图中显示模态视图?