0

TouchXML を使用して一部の XML を解析していますが、クラッシュ -EXC_BAD_ACCESS が発生しています。試行錯誤の結果、CXMLDocument (割り当てたもの) を解放しなければ問題ないことがわかりました。これが私のコードです:

- (NSArray *)getLookUps {

    //Do some stuff and then...

    NSData *tempData = [NSURLConnection sendSynchronousRequest:request 
                                                 returningResponse:nil 
                                                             error:nil];



        CXMLDocument *xmlDoc = [[CXMLDocument alloc] initWithData:tempData options:0 error:nil];
        NSDictionary *mappings = [NSDictionary dictionaryWithObject:@"http://****/****" 
                                                             forKey:@"****"];

        NSLog(@"%@", [[NSString alloc] initWithData:tempData encoding:NSUTF8StringEncoding]);
        NSArray *orders = [[xmlDoc rootElement] nodesForXPath:@"//****:Unit" 
                                            namespaceMappings:mappings 
                                                        error:nil];

        NSMutableArray *units = [NSMutableArray arrayWithCapacity:200];

        for (CXMLElement *order in orders) {
            NSArray *nodes = [order children];
            NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithCapacity:[nodes count]];

            for (CXMLElement *node in nodes) {
                [dictionary setObject:[node stringValue] forKey:[node name]];
            }
            [units addObject:dictionary];
        }

        //[xmlDoc release];
    return units;
}

最後の 2 行目を参照してください[xmlDoc release]。そうしないとクラッシュするので、コメントアウトしました。私は何を間違っていますか?ありがとう。

4

4 に答える 4

1

このバグは報告されており、ライブラリの新しいバージョンで修正済みとしてフラグが付けられています。

http://code.google.com/p/touchcode/issues/detail?id=35

実際に修正されているかどうかはテストしていませんが、その URL のコメントは修正されていないことを示唆しています。

私の意見では、このライブラリは完全に避けるべきです。iOS アプリの場合、いくつかの理由で libxml2 を使用します。

  • それは徹底的にテストされ、試行されました
  • 高速で効率的です
  • XML のノードベースの表現を構築すると、コーディングが容易になる可能性がありますが、常にドキュメント全体がメモリ内にあるため、メモリが浪費されます。解析中におそらく複数回使用しています。代わりに、libxml2 アプローチで動作するようにコードを設計する必要があります。かなりのサイズのドキュメントの解析を開始すると、同意するでしょう。
于 2011-10-24T20:28:24.017 に答える
0

私は TouchXML をかなり頻繁に使用しており、(幸いなことに?) 今までこの問題は発生していませんでしたが、たまたま起こったのです...

ここに解決策を投稿しました: [CXMLNode nodesForXPath] with namespace mappingsを使用したメモリクラッシュ

于 2013-09-24T08:03:12.490 に答える
0

TouchXML クラス "CXMLDocument" では、"dealloc" メソッドで次の処理が行われていることがわかりました。

- (void)dealloc
{
    // Fix for #35 http://code.google.com/p/touchcode/issues/detail?id=35 -- clear up the node objects first (inside a pool so I _know_ they're cleared) and then freeing the document

    @autoreleasepool {

        nodePool = NULL;

    }
    //
    xmlUnlinkNode(_node);
    xmlFreeDoc((xmlDocPtr)_node);
    _node = NULL;
}

「dealloc」で「autoreleasepool」を使用している理由がわかりません。これは標準コーディングですか?私が間違っている場合は修正してください。

于 2015-06-16T12:50:08.213 に答える