ios - 仅在对应于 dispatch_async 导出(ad-hoc 或在 AppStore 上)时,Objective-c 应用程序才会崩溃
问题描述
我在 iOS 应用程序上遇到崩溃,但只有在它被存档和导出(临时或在 AppStore 上)时。开发版没有任何问题。
崩溃与主队列上的 dispatch_async 相对应。尤其是:
dispatch_async(dispatch_get_main_queue(), ^{
...
[self.view hideToastActivity];
self.view.userInteractionEnabled = YES;
if (self.delegate != nil) {
[self.delegate postFooObject:foo];
}
...
});
可以看到,代码块调用了一个委托方法,其代码为:
- (void)postFooObject:(Foo *)foo {
[self.view makeToastActivity:CSToastPositionCenter];
self.view.userInteractionEnabled = NO;
[[FooManager sharedManager] postFoo:&foo completition:^(BOOL success) {
if (success) {
[self.view hideToastActivity];
self.view.userInteractionEnabled = YES;
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];
}
}
postFooObject委托方法包含对 REST 端点的调用,该端点成功返回。
由于它是一个生产应用程序,当应用程序被 iSO 控制台应用程序杀死时,我设法打印了日志。以下屏幕截图显示了崩溃时的设备日志:
应用程序进程由“赔偿”标识。
在 dispatch_async 本身之外执行 dispatch 块中包含的所有指令就可以了。
你能帮助我吗?谢谢
解决方案
主队列应仅用于 UI 任务,如果您正在进行休息调用,请尝试使用全局队列并使用主队列来使用新数据更新 UI 组件。
您是在模拟器还是 iPhone 上测试开发版本?这可能会对此代码产生不同的响应,但我认为更改队列应该可以解决您的问题!:)
祝你好运!