【问题标题】:Xcode application running on Iphone but crashing on IpadXcode 应用程序在 Iphone 上运行但在 Ipad 上崩溃
【发布时间】:2012-06-05 19:19:52
【问题描述】:

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

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

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

非常感谢任何有关如何解决此问题的建议。

【问题讨论】:

  • 在设备和模拟器上都会发生吗?如果在启用下面提到的all exceptions 后仍然没有得到可用信息,请继续使用大量带有 [object description] 的 NSLog(),直到找到 nil。

标签: iphone xcode ipad memory-leaks ios-universal-app


【解决方案1】:

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

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

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

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

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

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

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

最好的问候。

【讨论】:

  • 非常感谢,非常有帮助的回复。我终于弄明白了。干杯。
猜你喜欢
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多