iphone - 释放 NSXMLParser 时 EXC_BAD_ACCESS 崩溃

标签 iphone objective-c xml nsxmlparser

我在 [parser release] 上看到间歇性崩溃。我会说我大约有 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

在此先感谢您的帮助!

最佳答案

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

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

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

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

关于iphone - 释放 NSXMLParser 时 EXC_BAD_ACCESS 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/687197/

相关文章:

ios - 为什么不在后台重新打开应用程序调用 viewDidAppear?

iphone - UIViewController 作为单例

iphone - 用于 iPhone 的 Objective C 中的基本脏话过滤器

iphone - 如何在运行时确定二进制图像架构?

ios - 我想显示图表并比较它们

java - 如何基于 Avro Schema 将 XML 转换为 AVRO?

iphone - 使用 QuickLook 框架或 UiDocumentInteractionController 显示加密文件

c - ObjC 中的 long long int

html - 从 xml 创建可打印 pdf 的一般过程

android - 我可以使用 SAX 解析器解析二进制 XML 文件(在 res/xml 中)吗