我制作了一个通用应用程序,其中包含ipad和iphone UI的NIB文件。在我的视图中,控制器initWithNibName方法我调用UIUserInterfaceIdiomPad == UI_USER_INTERFACE_IDIOM()
来检测控制器是在iphone还是ipad上运行。
然后我启动他们各自的nib文件。当我在iphone上运行应用程序时,它运行正常,但是当我在ipad上运行它时,它最终会因EXC_BAD_ACCESS
错误而崩溃。当我使用视图控制器启动另一个视图控制器,然后在导航堆栈中启动另一个视图控制器时,会发生此错误。单击属于堆栈的第三个控制器的视图时,会发生此错误。
我无法区分导致崩溃的NIB
文件之间的区别。我一直在不知疲倦地弄清楚为什么会这样,但我无法解决这个错误。有没有人对可能发生的事情有任何见解?
非常感谢任何有关如何解决这个问题的建议。
答案 0 :(得分:2)
您应该做的第一件事是启用“所有异常”断点。这通常会准确地告诉您发生EXC_BAD_ACCESS的代码行。
接下来,我会打开僵尸,看看过度释放的位置。为此,在Xcode中,在按住选项键的同时,单击Product |运行....在随后的窗口中,将NSZombieEnabled添加到环境变量列表中。
然后跑。执行正常操作以导致崩溃并查看调试器所在的位置。运气好的话,它会停在问题实际发生的地方。
当您获得EXC_BAD_ACCESS时,这意味着您正在尝试访问/发布已经发布的内容。如果你处于非ARC状态,通常意味着你无意中发布了一些你不想要的东西,所以只需检查alloc / init和release balance。但是,如果你处于ARC状态,我敢打赌,当视图控制器被释放时,它不会引发委托。
例如,如果您有一个MKMapView并且已将其委托设置为您的视图控制器,那么您应该在视图被卸载或取消分配时使其委托无效。否则,消息将继续设置为它。或者,另一种可能性是您已将视图控制器添加为NSNotificationCenter观察器,并且在卸载或取消分配视图控制器时未将其作为观察者删除。
另一种可能性是您在通用应用程序的两个版本之间重新使用视图控制器。如果您通过iPad的笔尖中不存在的标识符访问任何内容,那将导致崩溃 - 尽管如果您使用的是笔尖而不是故事板,那可能不是问题。
这就是我现在所能想到的一切。尝试将其发生的位置归零并在此处发布代码,如果您仍然无法弄明白的话。
最好的问候。