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' 输出,它指向 [parser release]:

#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

看起来您正在使用多个线程。这可能有问题。线程错误经常会偶尔出现。您的解析器委托方法中可能还有一个错误,您没有在此处发布。

于 2009-03-26T20:20:31.010 回答
0

只有在解析完成后,您才需要删除您的数据。在委托方法中调用parserDidEndDocument:释放数据。

希望这有帮助。

蒂埃里

于 2009-03-27T01:51:56.923 回答
0

只有在解析完成后,您才需要删除您的数据。在委托方法中调用parserDidEndDocument:释放数据。

希望这有帮助。

蒂埃里

于 2009-03-27T01:56:53.603 回答