0

私のアプリケーションでは、バックグラウンド スレッドでサーバーから XML データをダウンロードし、データベース テーブルの解析と更新を行っています。

アプリケーションの起動中にバックグラウンド スレッドが作成され、実行が継続されます。

しかし、問題は NSXMLParser オブジェクトのリリース中にあります。EXC_BAD_ACCESS (SIGSEGV) を取得しています。XML パーサー コードは次のとおりです。

    - (void)parseXMLWithData:(NSMutableData *)pObjXMLBufferPtr
    {
        @try
        {
             [[NSURLCache sharedURLCache] setMemoryCapacity:0];
            [[NSURLCache sharedURLCache] setDiskCapacity:0];

            NSMutableData   *lTempData = [pObjXMLBufferPtr copy];
             NSXMLParser *lObjXMLParserPtr = [[NSXMLParser alloc] initWithData:lTempData];
            [lTempData release];

           [pObjXMLParserPtr setShouldResolveExternalEntities: YES];
           [pObjXMLParserPtr setDelegate: m_cObjSAXHandler];
           //m_cObjSAXHandler is my custom class. here is declaration SAXHandler :      
           NSObject<NSXMLParserDelegate>
          [pObjXMLParserPtr parse];

            [lObjXMLParserPtr setDelegate:nil];
            [lObjXMLParserPtr release];
            lObjXMLParserPtr = (NSXMLParser *)nil;
        }
        @catch (NSException *ex)
        {
               NSLog(@"parseXMLWithData Exception!!!");
        }
    }

Here is the crash log:
0   libicucore.A.dylib              0x34c00578 ucnv_close + 28
1   libxml2.2.dylib                 0x342a81ba xmlCharEncCloseFunc + 30
2   libxml2.2.dylib                 0x342c62d0 xmlFreeParserInputBuffer + 28
3   libxml2.2.dylib                 0x342aacbc xmlFreeInputStream + 108
4   libxml2.2.dylib                 0x342aace4 xmlFreeParserCtxt + 12
5   Foundation                      0x37d14b22 -[NSXMLParser dealloc] + 158

この問題を解決するのを手伝ってください。

4

2 に答える 2

1

同様の問題がありましたが、NSXMLParserlibxml (wsdl2objc で生成された SOAP クライアント) にアクセスする他のコードと一緒に混合していたためのようです。両方とも同じスレッドにありましたが、一方の寿命が他方と重なった場合、私はあなたとまったく同じクラッシュとスタック トレースを取得しました。2 つの亜種の有効期間を慎重に制御することで、問題が解決しました。私が経験していた問題は、xmlInitParser がNSXMLParserSOAP クライアント コードとは異なる方法で呼び出されたためだと思いますが、それは確認していません。

また、私がARCを使用していることにも言及する価値があります(ただし、NSXMLParserを含むクラスを非ARCにシフトすることを選択しましたが、主にデバッグを支援します)-デプロイメントターゲットが4.0のベースSDK 5.1 / 6

余談ですが、Colin-C による libxml のスレッド セーフ バージョンの構築に関する優れた記事がここにあります。

あなたや他の誰かがこれに出くわすのに役立つことを願っています.

于 2012-08-20T20:50:00.517 に答える
1

parseメソッドの直後にパーサーを解放し、そのデリゲート nil を設定しています。解析も内部的にバックグラウンドで行われているため、解析が終了するまで待つ必要があります。

メソッドでパーサーを解放するための何らかの通知または呼び出しメソッドを設定できますparserDidEndDocument

お役に立てれば。

于 2012-08-14T11:45:15.213 に答える