【发布时间】:2014-05-09 20:07:30
【问题描述】:
我有一个 iOS 应用程序在调用 __destroy_helper_block_253 和 __destroy_helper_block_278 时崩溃,我不确定“destroy_helper_block”指的是什么,或者它后面的数字应该指向什么。
是否有人对如何追踪这些崩溃可能发生的确切位置有任何指示?
这是一个示例回溯(请注意,带有__destroy_helper_block 的行仅引用它所包含的文件,而没有其他内容,通常也会包含行号)。
Thread : Crashed: com.apple.root.default-priority
0 libdispatch.dylib 0x000000018fe0eb2c _dispatch_semaphore_dispose + 60
1 libdispatch.dylib 0x000000018fe0e928 _dispatch_dispose + 56
2 libdispatch.dylib 0x000000018fe0e928 _dispatch_dispose + 56
3 libdispatch.dylib 0x000000018fe0c10c -[OS_dispatch_object _xref_dispose] + 60
4 Example App 0x00000001000fe5a4 __destroy_helper_block_278 (TSExampleApp.m)
5 libsystem_blocks.dylib 0x000000018fe53908 _Block_release + 256
6 Example App 0x00000001000fda18 __destroy_helper_block_253 (TSExampleApp.m)
7 libsystem_blocks.dylib 0x000000018fe53908 _Block_release + 256
8 libdispatch.dylib 0x000000018fe0bfd4 _dispatch_client_callout + 16
9 libdispatch.dylib 0x000000018fe132b8 _dispatch_root_queue_drain + 556
10 libdispatch.dylib 0x000000018fe134fc _dispatch_worker_thread2 + 76
11 libsystem_pthread.dylib 0x000000018ffa16bc _pthread_wqthread + 356
编辑 1:这是在发生崩溃的文件中定义的块之一的示例(删除了特定于应用程序的代码)。
- (void)doSomethingWithCompletion:(void (^)())completion {
void (^ExampleBlock)(NSString *) = ^{
NSNotification *notification = [NSNotification notificationWithName:kExampleNotificationName object:nil userInfo:nil];
[[NSNotificationCenter defaultCenter] postNotification:notification];
if (completion) {
completion();
}
};
// Async network call that calls ExampleBlock on either success or failure below...
}
文件中还有许多其他块,但其中大部分是作为方法的参数提供的,而不是先定义后引用。
编辑 2:为上述函数添加了更多上下文。
【问题讨论】:
-
您很可能错误地保留了该块。确保
copy用于存储。 -
数字是编译器分配的标识符。你拥有的数字是驱逐舰辅助块,而不是块本身。我会启用僵尸并尝试重现崩溃以查看释放了哪个对象。可能会告诉你哪个区块被过早释放。
-
启用僵尸对象怎么样?
-
另一个建议:启用异常断点
-
也许尝试在主队列的
dispatch_async中发布到NSNotificationCenter?
标签: ios objective-c objective-c-blocks