3

[パーサー リリース] で断続的なクラッシュが発生しています。約 5% の確率で発生すると思いますが、解析しているデータはクラッシュごとに異なります。私は一生、理由を理解することはできません。

バグ レポートを Apple に提出する前に (運が良ければ、サンプル コードでは再現できません)、誰かこれに遭遇して、何が起こっているのか知っていますか?

    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 の「where」出力は次のとおりです。

#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

助けてくれてありがとう!

4

4 に答える 4

4

私はそれを理解したと思います-アプリの他の場所のいくつかのコードは、次のようなXML関数を使用しています:

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

これらの関数は、投稿したコード フラグメントを実行しているときに、別のスレッドで実行されている可能性があります。NSXMLParser は明らかに内部で同じ関数を使用しています。

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

于 2009-03-26T23:15:36.487 に答える
0

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

この助けを願っています。

ティエリー

于 2009-03-27T01:51:56.923 に答える
0

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

この助けを願っています。

ティエリー

于 2009-03-27T01:56:53.603 に答える
0

複数のスレッドを使用しているようです。それに問題がある可能性があります。スレッドのバグは散発的に現れることがよくあります。ここに投稿していないパーサー デリゲート メソッドにもバグがある可能性があります。

于 2009-03-26T20:20:31.010 に答える