【问题标题】:Crash on orientation change after calling setViewControllers:animated:调用 setViewControllers:animated 后方向更改崩溃:
【发布时间】:2013-11-11 12:34:10
【问题描述】:

我一直在处理这个(有点)随机错误,但无法找出问题所在。上下文:我正在创建一个 UISplitView iPad 应用程序,该应用程序在主视图中有一个 UINavigationController:

主菜单为红色,子菜单为绿色,主要内容为紫色。

这个 UINavigationController 没有填满整个主视图,因为我需要一些空间来拥有一个垂直菜单。当用户选择垂直侧菜单上的按钮时,它会为 UINavigationController 设置一些新内容以显示带有选项的 UITableView。我对每个菜单选择所做的是:

[self.subMenu setViewControllers:@[subMenuViewController] animated:YES];

发生的情况是我不需要保留菜单历史记录,所以我所做的就是每次都为 subMenu 设置一个新的根视图控制器。

问题是当我开始弄乱设备方向时。它没有明确的模式,但有时,在旋转时,我的应用程序会崩溃。现在,当我使用 Instruments 运行它时,我得到的是:

167 Zombie      -1  00:32.101.527   UIKit   -[UITableView _spacingForExtraSeparators]

有趣的是,错误访问发生在 subMenu 的前一个根视图控制器上。因此,如果我点击“事件”,然后点击“播客”,则会在尝试访问“EventsViewController”时发生错误访问。

所以我猜测在替换 subMenu UINavigationController 的根视图控制器的方式上有些地方不对劲,但我不确定它是什么。也许我需要确保在设置新的根视图控制器之前释放当前的根视图控制器?

非常感谢任何帮助。 :)

【问题讨论】:

  • 您正在调用一个已释放的实例。在您的应用程序中添加一个“异常断点”并尝试复制您的问题:应用程序应该在导致您的问题的确切点停止。
  • @MarcoPace 我这样做了,但它总是给我在 UIApplicationMain 上的错误访问权限
  • 您在拆分视图控制器中使用viewContainers 吗?

标签: ios objective-c uinavigationcontroller orientation


【解决方案1】:

由于您的设置不正确而导致系统库代码崩溃的情况并不少见。 这可能是您的 UIWindow、UIApplicationMain 或其内容视图或您的视图控制器实例未保留或以某种方式释放。

如果你的控制器不在身边,shouldrotate 方法将无济于事。

这是为了识别哪个对象被释放了。

对于特别棘手的问题,您可以将 release、retain 和 dealloc 方法(记录并调用 super)添加到您的可疑类中,然后查看释放它的内容。记录 -retaincount 以进行跟踪(我仅将其用于诊断目的,)

或者你可以试试这个,在 -[UIDevice setOrientation:] 上设置一个断点,然后在调试器中单步调试你的代码。

为了使调试更容易,您可以在调试器控制台中键入 call (void)instrumentObjcMessageSends(YES) 以开始将 objc_msgSends 记录到 /tmp/,然后继续执行,它将跟踪所有发送的消息,直到崩溃。

【讨论】:

  • 我喜欢在“setOrientation:”上设置断点的想法,但是我应该把断点放在哪里?
  • 你做了,但我没有在我的代码中的任何地方使用 [UIDevice setOrientation:]。这就是我问的原因。
【解决方案2】:

首先,您应该在包含UITableView 的视图控制器中实现方法willRotateToInterfaceOrientationwillAnimateToInterfaceOrientationdidRotateToInterfaceOrientation(检查这些方法的实际签名)。

在每个方法中检查您的表视图数据源和委托。我认为这次崩溃是由委托或表视图的数据源的释放引起的。

您还应该检查在轮换期间调用了哪些 table view delgate/datasource 方法。

最后一件事,确保你丢弃了 subMenuViewController 的旧实例,并且它们被正确地从父视图控制器中删除。

【讨论】:

  • 好主意!会这样做,看看它是否有帮助。谢谢!
  • 让我知道结果 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多