应用卡在 iOS 9 的启动画面中,没有错误

App stuck in splash screen on iOS 9 with no error

我的应用在 iPhone 和模拟器上都卡在 iOS 9 的启动画面上。我可以 运行 它在 iOS 8 或更低版本的设备和模拟器上没有问题。我在同一个应用程序上工作的同事有完全相同的问题。

没有错误或任何错误,只是挂在初始屏幕上。如果我在 xcode 上停止它并尝试直接从 phone 或模拟器 运行 它,它将 运行 没有任何问题。

顺便说一下,我没有看到 didFinishLaunchingWithOptionswillFinishLaunchingWithOptions 接到电话!

好的,我想我找到了答案。

您必须在所有 "Valid Architectures" 中指定 arm64。 如果您没有指定 arm64 或忘记了一个,应用程序将不会启动并停留在初始屏幕上。

刚刚验证了这一点。

这是 Xcode 7 错误吗?

我将调试和发布都设置为否 你确定 "any SDK" 也有 arm64 吗?

好的,我找到问题了。虽然听起来很荒谬!!

我正在使用 UITabBarController,在第一个控制器中我有一个 UITableViewController 和一个自定义数据源 class,它将启动一个硬代码 table header 并且这些 header 已本地化!!

+ (void)initialize {
    titles = @[NSLocalizedString(@"CODE", nil), NSLocalizedString(@"ERROR", nil), NSLocalizedString(@"TROUBLESHOOTING", nil)];
}

在跟踪堆栈之后,我意识到进程卡在那里,没有任何跟踪和错误!我仍然不知道为什么!

所以我想出了一个解决方法:

+ (void)initialize {
    titles = @[@"Code",@"Error",@"Troubleshooting"];
}

返回文本时只检索本地化值:

- (NSString *)titleAt:(NSInteger)index {
    return NSLocalizedString(titles[index],nil);
}

在您的 "answer" 中包含代码:

+(void)initialize
{

   titles = @[NSLocalizedString(@"CODE", nil), NSLocalizedString(@"ERROR", nil), NSLocalizedString(@"TROUBLESHOOTING", nil)];
}

这确实是您问题的根源。在实施 +load+initialize 时非常小心是明智的。 @bbum a great article 恰好是那个话题。

+initialize 在第一次触摸 class(或类别)时被调用 - 当 class 被初始化时 +initialize 被 class 加载机制。无法保证在 class 加载过程中何时会发生这种情况,这是您问题的一部分。

在您的情况下,您使用的是 NSLocalizedString - 这在引擎盖下可能相当重。它依赖于其他几个 classes(NSString,等等)并且可能访问文件系统。正如@bbum 在他的文章中指出的那样,这可能会导致严重的麻烦。在您的情况下,这可能是一个令人讨厌的僵局。

将您的 titles = @[NSLocalizedString... 行移动到对象中更合适的位置,例如初始化程序、awakeAfterUsingCoder: 等,您的直接问题应该得到解决。这样做之后,您应该检查整个代码库以查找实施了 +initialize+load 的实例,并对其进行审核以确保这些使用符合@bbum 的建议。