应用卡在 iOS 9 的启动画面中,没有错误
App stuck in splash screen on iOS 9 with no error
我的应用在 iPhone 和模拟器上都卡在 iOS 9 的启动画面上。我可以 运行 它在 iOS 8 或更低版本的设备和模拟器上没有问题。我在同一个应用程序上工作的同事有完全相同的问题。
没有错误或任何错误,只是挂在初始屏幕上。如果我在 xcode 上停止它并尝试直接从 phone 或模拟器 运行 它,它将 运行 没有任何问题。
顺便说一下,我没有看到 didFinishLaunchingWithOptions
或 willFinishLaunchingWithOptions
接到电话!
好的,我想我找到了答案。
您必须在所有 "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 的建议。
我的应用在 iPhone 和模拟器上都卡在 iOS 9 的启动画面上。我可以 运行 它在 iOS 8 或更低版本的设备和模拟器上没有问题。我在同一个应用程序上工作的同事有完全相同的问题。
没有错误或任何错误,只是挂在初始屏幕上。如果我在 xcode 上停止它并尝试直接从 phone 或模拟器 运行 它,它将 运行 没有任何问题。
顺便说一下,我没有看到 didFinishLaunchingWithOptions
或 willFinishLaunchingWithOptions
接到电话!
好的,我想我找到了答案。
您必须在所有 "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 的建议。