0

私はアーク以外のプロジェクトを持っています。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 に変換しましたが、クラッシュしませんでした。

4

1 に答える 1

1

あなたが示したものはすべて、ブロックとメモリ管理に関して問題ないようです。それは何か別のものでなければなりません。

使用していないC 文字列 ( char ポインター ) を渡していることに気付きましたreceivedData。実際のコードを示しておらず、実際にreceivedDataブロック内で変数を使用している場合、ブロックは単に char ポインターをキャプチャするだけで、ポインターの背後にある文字列のメモリを管理しないため、問題になる可能性があります。 (Objective-C オブジェクトではありません)。したがって、C 文字列が呼び出しスコープ (非同期操作の前) でのみ有効であり、非同期操作の実行時には有効でなくなる可能性があります。何かがクラッシュしているというあなたの声明はstrlen、C文字列に何か問題があるという考えを裏付けています。オブジェクトとしてブロックによって適切にメモリ管理されるため、代わりに NSString オブジェクトを使用してみてください。

于 2012-11-14T21:16:26.350 に答える