【发布时间】:2012-10-16 10:38:54
【问题描述】:
在升级 xcode 并使用 iOS 6 SDK 编译我的应用程序后,我在应用程序中遇到了很多崩溃。从我能够追踪的情况来看,UIKit 消息在模态 segue 期间释放了视图控制器,而不是新创建的。下面是它的外观:
我有一个显示导航控制器的标签栏控制器。 Navigation Controller 显示的另一个视图控制器显示了一个模态视图控制器。
TabbarController --> NavigationController --> ViewController (presenting) -- |显示使用模态segue | --> ViewController(展示)
导致崩溃的步骤:
- 在上面显示的层次结构中访问视图控制器(呈现)。它不是根视图cntrl,而是更高。
- 触发模式视图控制器的 segue。
- 从标签栏选择一个标签(无论哪个),然后返回到同一个视图控制器(呈现)。选择一个选项卡会调用导航控制器上的 popToRoot。
- 再次触发视图控制器的模态转场(展示)
- 崩溃:僵尸对象 - 视图控制器(显示)- 收到消息
为什么? 当调用 popToRoot 并且正在清理视图控制器(呈现)时,看起来就像在以前的 iOS 上一样,模态视图也被破坏了。因此,当它再次被访问时,它被重新创建并呈现。 在 iOS 6 上,Allocations Instrumentation 显示模态视图与 视图控制器(呈现)。但是当它由于某种原因被访问时,UIKit 创建了一个新的 modav 视图控制器,然后向不再存在的旧视图控制器发送消息。没有意义。
让我感到奇怪的另一件事是,在 iOS 5 上,Allocations Instrumentation 工具从未向我显示保留计数 = 0 的视图控制器(已显示),但 iOS 6 会显示(之后将其设为 -1)。
我知道这可能是一个很难帮助我解决的问题,但也许有人已经在解决 iOS 6 和此类问题的问题了?
从 Allocations Instrumentation 工具中,我可以看出 iOS 6 上 segue 的实现发生了很多变化。
【问题讨论】:
标签: cocoa-touch ios6