我有一個非弧項目。我試圖使用dispatch_async從服務器獲取數據並將其保存在sqlite中。 dispatch_async在具有回調的方法內發生。在調用該方法時,應用程序會崩潰,並導致訪問不良。這裏是我如何實現代碼。使用塊調度異步exc_bad_access非ARC項目
- (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得到。
我在做什麼錯?
編輯: 刪除塊並使用dipatch_async產生相同的exc_bad_access崩潰。
編輯2: 我試過下面給出的示例答案,它仍然崩潰。
我想複製它然後autorelease它。它經常崩潰,但尼特。我要檢查內存泄漏。我會報告。
HandleResponse *handleResponse = [[[HandleResponse alloc] init] autorelease];
[handleResponse HandleData:aData WithSuccess: [[^(BOOL finishing) {
if(finishing)
{
//update the UI here
}
} copy] autorelease];
編輯3:
墜機發生在strlen的甚至XML內容是xmlResopnse。但爲什麼出現這種情況與調度,而不是沒有它
xmlDocPtr xml= xmlParseMemory(xmlResopnse, strlen(xmlResponse);
編輯4:下面 作爲答案不建議在調度異步使用C對象。所以我將xmlResponse從const char *轉換爲nsstring,並且不會崩潰。
請發佈一個stacktrace。 – trojanfoe