发布NSXMLParser时EXC_BAD_ACCESS崩溃

时间:2009-03-26 19:24:50

标签: iphone objective-c xml nsxmlparser

我看到[解析器发布]出现间歇性崩溃。我说我看到它大约有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 个答案:

答案 0 :(得分:4)

我想我已经明白了 - 应用程序中其他地方的一些代码使用XML函数,例如:

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

这些函数可能在我执行我发布的代码片段的同时在另一个线程中执行。 NSXMLParser显然使用相同的功能。

我使用与我用于NSXMLParser用法的锁对象相同的锁定对象向其他代码添加了一个synchronized块,崩溃似乎已经消失了。所以我想这里的教训是这些XML函数完全不是线程安全的 - 请谨慎使用!

答案 1 :(得分:0)

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

答案 2 :(得分:0)

只有在解析完成后才需要删除数据。 在名为parserDidEndDocument的委托方法中:发布数据。

希望得到这个帮助。

亨利

答案 3 :(得分:0)

只有在解析完成后才需要删除数据。在名为parserDidEndDocument的委托方法中:发布数据。

希望得到这个帮助。

亨利