我在 [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/