私はアーク以外のプロジェクトを持っています。dispatch_async を使用してサーバーからデータを取得し、sqlite に保存しようとしています。dispatch_async は、コールバックのあるメソッド内で発生します。メソッドを呼び出すと、exc bad access でアプリがクラッシュします。これが私がコードを実装した方法です。
- (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 を削除してもクラッシュしませんが、sqlite への書き込み中に UI がブロックされます。
私は何を間違っていますか?
edit : ブロックを削除して dipatch_async を使用すると、同じ exc_bad_access クラッシュが発生します。
編集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);
編集4: 以下の回答のように、ディスパッチ非同期でcオブジェクトを使用しないことを提案しました。そのため、xmlResponse を const char* から nsstring に変換しましたが、クラッシュしませんでした。