在iPhone上运行的Xcode应用程序,但在Ipad上崩溃

问题描述:

我做了一个通用的应用程序,包含ipad和iphone用户界面的NIB文件。在我看来控制器的initWithNibName方法我打电话UIUserInterfaceIdiomPad == UI_USER_INTERFACE_IDIOM()来检测控制器是否在iPhone或iPad上运行。在iPhone上运行的Xcode应用程序,但在Ipad上崩溃

然后我启动它们各自的nib文件。当我在iphone上运行应用程序时,它运行良好,但是当我在ipad上运行它时,它最终会崩溃,并显示EXC_BAD_ACCESS错误。当我使用视图控制器启动另一个视图控制器,然后在导航堆栈中启动另一个视图控制器时,会发生此错误。只要我点击属于堆栈第三个控制器的视图,就会发生此错误。

我无法区分可导致崩溃的NIB文件之间的差异。我一直在不知疲倦地弄清楚为什么会发生这种情况,但我无法解决这个错误。有没有人对可能发生的事情有所了解?

任何关于如何解决这个问题的建议将非常感激。

+0

这是否发生在设备和模拟器上?如果在启用下面提到的所有异常之后仍然没有可用的信息,那么在[对象描述]中继续大量的NSLog(),直到找到一个为零的。 –

您应该做的第一件事是启用“所有异常”断点。这通常会准确地告诉您EXC_BAD_ACCESS正在发生的代码行。

enter image description here

接下来,我会变成僵尸,看看那里的过度释放发生。为此,在Xcode中,按住选项键的同时,单击Product |运行....在随后的窗口中,将NSZombieEnabled添加到环境变量列表中。

enter image description here

然后运行。执行正常的事情来引起崩溃并查看调试器的着陆点。如果运气好的话,它会停止问题实际发生的地方。

当你得到一个EXC_BAD_ACCESS时,这意味着你正试图访问/发布已经发布的东西。如果你处于非ARC环境中,通常意味着你不经意地发布了某些东西,所以只需检查alloc/init并释放余额。但是,如果您处于ARC环境中,我敢打赌,它与视图控制器发布时不委托委托人有关。

例如,如果你有一个的MKMapView,并设置其委托给您的视图控制器,你应该为零其委托时,你的观点被卸载或dealloc'd。否则,消息将继续被设置。或者,另一种可能是您已将视图控制器添加为NSNotificationCenter观察器,并且在视图控制器被卸载或释放时并未将其作为观察者移除。

另一种可能是您在通用应用程序的两个版本之间重新使用视图控制器。如果您正在使用iPad中笔记本中不存在的标识符访问任何内容,则会导致崩溃 - 尽管如果您使用笔尖而不是故事板,那可能不是问题。

这就是我现在所能想到的。尝试将它发生的地方归零,并在这里发布代码,如果你仍然无法弄清楚。

此致敬礼。

+0

非常感谢,非常有帮助的回应。我终于弄明白了。干杯。 – Andrew