【发布时间】:2014-08-11 19:59:02
【问题描述】:
我在 dispatch_semaphore_dispose 上收到 EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) 但我真的不知道如何追查其根本原因。我的代码使用了 dispatch_async、dispatch_group_enter 等等。
更新: 崩溃的原因是由于 webserviceCall(见下面的代码)从不调用 onCompletion 并且当代码再次运行时,我收到错误 EXC_BAD_INSTRUCTION。我证实确实如此,但不知道为什么或如何防止这种情况。
代码:
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_group_t group = dispatch_group_create();
for (...) {
if (...) {
dispatch_group_enter(group);
dispatch_async(queue, ^{
[self webserviceCall:url onCompletion:^{
dispatch_group_leave(group);
}];
});
}
}
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)));
dispatch_sync(queue, ^{
// call completion handler passed in by caller
});
});
【问题讨论】:
-
不是重复的。我看了看,对我没有帮助。注意我的也是 EXC_I386_INVOP。
-
这可能是 ARC 问题。发布您对调度组、信号量或 dispatch_sync 所做的任何事情。 ARC 可能正在尝试处理已设置为 NULL 的信号量。
-
为了在块内使用weakSelf。
-
FYI 1. 如果您创建了一个由您自己编写的
fatalError/assertionFailure,您将收到一个错误EXC_BAD_INSTRUCTION。因此你应该明白为什么你已经达到了你自己的断言,即查看它的信息。话虽如此,这个错误是由编译器产生的。 2. 我的观点是编译器也使用fatalError,我们看到的许多错误都是因为这个
标签: ios objective-c exception grand-central-dispatch