【发布时间】: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 个控制器序列中首先放置的任何控制器上。
有什么想法吗?我完全被卡住了......
【问题讨论】: