【问题标题】:Strange Crash on iPhone 3G/iPod 2GiPhone 3G/iPod 2G 上的奇怪崩溃
【发布时间】:2011-04-28 20:08:03
【问题描述】:

我真的很想解决一个奇怪的问题。我的应用程序的一些用户报告说应用程序无法启动,但在显示启动屏幕 2 秒后崩溃。这只发生在较旧的 iPod 2G/iPhone 3G 上。在拿到设备后,我试图追踪它。

调试代码不会发生崩溃,而只有发布版本才会发生崩溃。在崩溃发生之前,我的代码根本不会执行。一些 UIViewControllers 在我的 AppDelegate 中初始化,无论我在这里选择什么顺序,它们中的第一个在运行 initWithNibName 后都会失败,这对于所有控制器都是相同的,并为通用应用程序处理正确 XIB 的加载:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
  if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    NSString *ipadXib = [NSString stringWithFormat:@"%@-iPad", [[self class] description]];
    return [super initWithNibName:ipadXib bundle:nibBundleOrNil];
  } else {
    return [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
  }
}

这段代码运行良好,但是当从这里返回时,我最终在 UIKit 的某个地方(不是我的代码)出现 SIGBUS 错误。我怀疑上面的编码,因为当我根本不覆盖 initWithNibName (这对于 iPhone 版本是可以的)时,完整的代码会运行。如果我只是在这里调用 [super ...] 它也可以,但是我怀疑编译器会简单地优化它,与根本不覆盖它具有相同的效果。由于 InterfaceIdiom 不是 iPad,所以只使用相同的超级功能而不更改参数,所以它应该是不费吹灰之力的。 它适用于所有其他设备。没有分析仪错误,没有任何泄漏。它真的发生得太早了,以至于当崩溃发生时,除了上面的代码之外,我的代码几乎没有被调用。它发生在我在 4 个控制器序列中首先放置的任何控制器上。

有什么想法吗?我完全被卡住了......

【问题讨论】:

    标签: iphone ios sdk


    【解决方案1】:

    只是想知道他们运行的是什么 iOS? UIUserInterfaceIdiomPad 适用于 iOS 3.2 及更高版本。

    如果是这种情况,你应该检查这个帖子How does one get UI_USER_INTERFACE_IDIOM() to work with iPhone OS SDK < 3.2

    【讨论】:

      【解决方案2】:

      经过更多研究(整个晚上:-( ),我发现这只是 XCode 4.0 LLVM 的编译器问题。XCode 4.0.2 的发行说明显示,特别是这个编译器错误(阻碍 arm6 上的堆栈帧架构)现在已修复。安装 4.0.2 并重新编译后,现在一切正常。 奇怪的是,我收到了来自 Apple 的邮件,说我应该买一台 iPad 2 作为复活节礼物,或者说现在可以买到白色 iPhone,但没有任何信息表明大约 2 周前进行了如此重要的修复:-(

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-17
        • 1970-01-01
        相关资源
        最近更新 更多