2009-03-26 18 views
3

[パーサーのリリース]で断続的なクラッシュが発生しています。私は時間の約5%を見て、私が解析しているデータは各クラッシュ間で異なると言いたい。なぜ私は私の人生のために理解することはできません。NSXMLParserをリリースするとEXC_BAD_ACCESSがクラッシュする

Appleにバグレポートを提出する前に(私の運があれば、サンプルコードで再現できない)、誰もがこれに遭遇して何が起こっているのか知っていますか?任意の助けを事前に

#0 0x93d08d12 in xmlCharEncCloseFunc() 
#1 0x93cfc0e3 in xmlFreeParserInputBuffer() 
#2 0x93cfc08f in xmlFreeInputStream() 
#3 0x93cfbdac in xmlFreeParserCtxt() 
#4 0x961384d6 in -[NSXMLParser dealloc]() 
#5 0x00149de7 in -[MyParserClass parseResponse] (self=0x104e9f0, _cmd=0x1766dc) at /Users/mike/Documents/MyApp/Classes/MyParserClass.m:60 

ありがとう:

NSData *d = [data copy]; // data is typically 2K-13K bytes 
    @synchronized (xmlParserLock) { 
     [[NSURLCache sharedURLCache] setMemoryCapacity:0]; 
     [[NSURLCache sharedURLCache] setDiskCapacity:0]; 

     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
     NSXMLParser *parser = [[NSXMLParser alloc] initWithData:d]; 
     [parser setDelegate:self]; 
     [parser setShouldProcessNamespaces:NO]; 
     [parser setShouldReportNamespacePrefixes:NO]; 
     [parser setShouldResolveExternalEntities:NO]; 
     [parser parse]; 
     [parser release]; 
     [pool release]; 
    } 
    [d release]; 

そしてここでは、[パーサーリリース]を指すGDB 'どこ' 出力、です!

+0

はあなたがここにMyParserClassで見せている方法の断片であり、かつライン60上の[パーサーリリース]ですか? –

+0

ブレント:そうです。 –

答えて

4

が、私はそれを考え出したと思うアプリで他の場所でいくつかのコードは、次のようなXML機能を使用しています。明らかにNSXMLParserは同じ機能をフードの中で使用します。

NSXMLParser用に使用しているのと同じロックオブジェクトを使用して、他のコードに同期ブロックを追加しました。クラッシュが消滅したようです。だから私はここの教訓は、これらのXML関数はスレッドセーフではないということです - 注意して使用してください!

0

複数のスレッドを使用しているようです。そこに問題があるかもしれません。スレッディングバグは、しばしば散発的に現れます。パーサのデリゲートメソッドにバグがあるかもしれませんが、ここには投稿しませんでした。これらの機能は、おそらく同時に別のスレッドで実行されている

xmlCtxtReadMemory() 
xmlClearParserCtxt(); 
xmlFreeParserCtxt(); 
xmlCleanupParser(); 
xmlFreeDoc(); 

私は投稿のコードフラグメントを実行しています: -

+0

私は、NSXMLParserが複数のスレッドでうまくいかないことを読んだので、はい、割り当てと割り当て解除を同期させました。限り、NSXMLParserに関しては、これは問題の複数のスレッドの角度を削除する必要があります、私は思います。 –

+0

デリゲートメソッドに関しては、NSXMLParserの割り当てを解除したときに悪いアクセスが発生する理由と結びついていることが、私がそこで何をしているのか分かりません。それはかなり奇妙です。コメントしてくれてありがとう。 –

0

解析が完了したときにのみデータを削除する必要があります。 parserDidEndDocumentというデリゲートメソッドで、データを解放します。

このヘルプが必要です。

thierry

0

解析が完了したときにのみデータを削除する必要があります。 parserDidEndDocument:デリゲートメソッドでデータを解放します。

このヘルプが必要です。

ティエリ

関連する問題