我一直在处理这个(某种程度上)随机错误,但无法弄清楚问题。上下文:我正在创建一个UISplitView iPad应用程序,在主视图中有一个UINavigationController:
主菜单为红色,子菜单为绿色,主要内容为紫色。
这个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的根视图控制器的方式上有些不对,但我不确定它是什么。也许我需要确保在设置新的根视图控制器之前释放它?
非常感谢任何帮助。 :)
答案 0 :(得分:4)
由于您未正确设置的内容,系统库代码中的不常见。 这可能是您的UIWindow,UIApplicationMain或其内容视图或视图控制器实例未被保留或以某种方式发布。
如果你的控制器还不在,那么shouldrotate方法将无济于事。
这是为了识别哪个对象被释放。
对于特别棘手的问题,您可以将release,retain和dealloc方法(记录并调用super)添加到您的可疑类中,并查看释放它的内容。记录-retaincount以跟踪(我仅将其用于诊断目的),
或者您可以尝试这一点,在 - [UIDevice setOrientation:]上设置断点并在调试器中逐步执行代码。
为了使调试更容易,您可以在调试器控制台中键入call(void)instrumentObjcMessageSends(YES)以开始将objc_msgSends记录到/ tmp /,然后继续执行,它将跟踪直到发送的所有消息。崩溃。
答案 1 :(得分:2)
首先,您应该在包含willRotateToInterfaceOrientation
的视图控制器中实现方法willAnimateToInterfaceOrientation
,didRotateToInterfaceOrientation
和UITableView
(检查这些方法的实际签名)。
在每个方法中检查您的表视图dataSource和delegate。我认为这次崩溃是由委托或表视图的数据源发布引起的。
此外,您应该检查在旋转期间调用哪个表视图delgate / datasource方法。
最后一点,确保丢弃subMenuViewController
的旧实例,并将它们从父视图控制器中正确删除。