我真的在一个奇怪的问题上喋喋不休。我的应用程序的某些用户报告该应用程序无法启动,但在显示启动屏幕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个控制器序列中首先放置的控制器中。
有什么想法吗?我完全陷入困境......
答案 0 :(得分:0)
只是想知道他们在运行什么iOS? UIUserInterfaceIdiomPad在iOS 3.2及更高版本中可用。
如果是这种情况,您应该检查此帖子How does one get UI_USER_INTERFACE_IDIOM() to work with iPhone OS SDK < 3.2
答案 1 :(得分:0)
经过一些更多的研究(整晚:-()),我发现它只是XCode 4.0 LLVM的编译器问题.XCode 4.0.2的发行说明揭示了,特别是这个编译器错误(阻碍了arm6上的堆栈帧)现在已修复。安装4.0.2并重新编译后,一切正常。 奇怪的是,我收到了来自Apple的邮件,我应该买一台iPad 2作为复活节的礼物,或者现在有一个白色的iPhone,但没有任何信息,大约2周前这样一个重要的修复程序被发送给开发人员:-(