调用setViewControllers后方向更改崩溃:动画:

时间:2013-11-11 12:34:10

标签: ios objective-c uinavigationcontroller orientation

我一直在处理这个(某种程度上)随机错误,但无法弄清楚问题。上下文:我正在创建一个UISplitView iPad应用程序,在主视图中有一个UINavigationController:

Main menu in red, submenu in green and main content in purple 主菜单为红色,子菜单为绿色,主要内容为紫色。

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

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

我不需要保留菜单历史记录,所以我每次都会将新的根视图控制器设置为subMenu。

问题是当我开始搞乱设备方向时。它没有清晰的图案,但有时,在旋转时,我的应用程序崩溃了。现在,当我使用Instruments运行它时,这就是我得到的:

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

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

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

非常感谢任何帮助。 :)

2 个答案:

答案 0 :(得分:4)

由于您未正确设置的内容,系统库代码中的不常见。 这可能是您的UIWindow,UIApplicationMain或其内容视图或视图控制器实例未被保留或以某种方式发布。

如果你的控制器还不在,那么shouldrotate方法将无济于事。

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

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

或者您可以尝试这一点,在 - [UIDevice setOrientation:]上设置断点并在调试器中逐步执行代码。

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

答案 1 :(得分:2)

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

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

此外,您应该检查在旋转期间调用哪个表视图delgate / datasource方法。

最后一点,确保丢弃subMenuViewController的旧实例,并将它们从父视图控制器中正确删除。