0

我制作了一个通用应用程序,其中包含 ipad 和 iphone UI 的 NIB 文件。在我的视图控制器 initWithNibName 方法中,我调用UIUserInterfaceIdiomPad == UI_USER_INTERFACE_IDIOM()以检测控制器是在 iphone 还是 ipad 上运行。

然后我启动他们各自的 nib 文件。当我在 iphone 上运行该应用程序时,它可以正常工作,但是当我在 ipad 上运行它时,它最终会因EXC_BAD_ACCESS错误而崩溃。当我使用视图控制器启动另一个视图控制器,然后在导航堆栈中启动另一个视图控制器时,会发生此错误。当我单击属于堆栈的第三个控制器的视图时,就会发生此错误。

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

任何有关如何解决此问题的建议将不胜感激。

4

1 回答 1

2

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

在此处输入图像描述

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

在此处输入图像描述

然后运行。做正常的事情来导致崩溃并查看调试器的位置。运气好的话,它会在问题实际发生的地方停止。

当您获得 EXC_BAD_ACCESS 时,这意味着您正在尝试访问/发布已发布的内容。如果您处于非 ARC 情况,这通常意味着您无意中释放了某些内容,因此只需检查 alloc/init 和释放平衡。但是,如果您处于 ARC 情况,我敢打赌这与释放视图控制器时不取消委托有关。

例如,如果您有一个 MKMapView 并将其委托设置为您的视图控制器,则当您的视图被卸载或解除分配时,您应该将其委托为零。否则,消息将继续设置为它。或者,另一种可能性是您已将视图控制器添加为 NSNotificationCenter 观察者,并且在视图控制器被卸载或解除分配时没有将其作为观察者移除。

另一种可能性是您在通用应用程序的两个版本之间重复使用视图控制器。如果您通过 iPad 笔尖中不存在的标识符访问任何内容,则会导致崩溃——尽管如果您使用笔尖而不是情节提要,这可能不是问题。

这就是我现在能想到的。如果您仍然无法弄清楚,请尝试将其发生的位置归零并在此处发布代码。

最好的祝福。

于 2012-06-05T20:03:09.883 回答