dispatch async with blocks exc_bad_access non ARC project



我有一个非弧形项目。我正在尝试使用dispatchasync从服务器获取数据并将其保存在sqlite中。dispatchasync发生在带有回调的方法内部。在调用该方法时,该应用程序会因exc错误访问而崩溃。以下是我如何实现代码的。

- (void) HandleData:(const char*) receivedData WithSuccess:(void(^)(BOOL finishing))completed
{
dispatch_queue_t fetchQ = dispatch_queue_create("Refreshing", NULL);
dispatch_async(fetchQ, ^{
[self write_data_in_sqlite]//    **<--crash happens here in the method which is called here**
}
dispatch_sync(dispatch_get_main_queue(), ^{
completed(YES);
});
});
dispatch_release(fetchQ);
}

我把这个方法称为:

HandleResponse *handleResponse = [[[HandleResponse alloc] init] autorelease];
[handleResponse HandleData:aData WithSuccess:^(BOOL finishing) {
if(finishing)
{
//update the UI here
}
}];

如果我删除dispatch_async,那么它不会崩溃,但我的UI在写入sqlite时会被阻塞。

我做错了什么?

编辑:删除块并使用dipatchasync会产生相同的excbadAccess崩溃。

编辑2:我尝试了下面给出的示例答案,它仍然崩溃。

我想复制它,然后自动释放它。它仍然崩溃,但没有那么频繁。我要检查内存是否泄漏。我会报告的。

HandleResponse *handleResponse = [[[HandleResponse alloc] init] autorelease];
[handleResponse HandleData:aData WithSuccess: [[^(BOOL finishing) {
if(finishing)
{
//update the UI here
}
} copy] autorelease];

编辑3:

即使xml内容在xmlResopnse中,strlen也会发生崩溃。但为什么这种情况会发生在调度中,而不是没有

xmlDocPtr xml= xmlParseMemory(xmlResopnse, strlen(xmlResponse);

edit4:在下面的回答中建议不要在dispatch-async中使用c对象。所以我将xmlResponse从constchar*转换为nsstring,它不会崩溃。

您所展示的一切在块和内存管理方面似乎都很好。一定是别的东西。

我注意到您正在传递一个未使用的C字符串(char指针receivedData)。如果你没有向我们展示真实的代码,而你实际上在块中使用了receivedData变量,那么这可能是一个问题,因为块只是捕获char指针,但不管理指针后面的字符串的内存(它不是Objective-C对象)。因此,C字符串可能只在调用范围内有效(在异步操作之前),而在异步操作运行时不再有效。您关于strlen出现崩溃的声明支持某些C字符串出现问题的观点。您应该尝试使用NSString对象,因为作为对象,它们是由块正确管理的内存。

相关内容

最新更新