在我的应用程序中,我在后台线程中从服务器下载XML数据,并进行解析并更新数据库表
后台线程将在应用程序启动期间创建并继续运行。
但问题是在NSXMLParser对象发布期间,我得到了EXC_BAD_ACCESS(SIGSEGV) 这是XML Parser代码:
- (void)parseXMLWithData:(NSMutableData *)pObjXMLBufferPtr
{
@try
{
[[NSURLCache sharedURLCache] setMemoryCapacity:0];
[[NSURLCache sharedURLCache] setDiskCapacity:0];
NSMutableData *lTempData = [pObjXMLBufferPtr copy];
NSXMLParser *lObjXMLParserPtr = [[NSXMLParser alloc] initWithData:lTempData];
[lTempData release];
[pObjXMLParserPtr setShouldResolveExternalEntities: YES];
[pObjXMLParserPtr setDelegate: m_cObjSAXHandler];
//m_cObjSAXHandler is my custom class. here is declaration SAXHandler :
NSObject<NSXMLParserDelegate>
[pObjXMLParserPtr parse];
[lObjXMLParserPtr setDelegate:nil];
[lObjXMLParserPtr release];
lObjXMLParserPtr = (NSXMLParser *)nil;
}
@catch (NSException *ex)
{
NSLog(@"parseXMLWithData Exception!!!");
}
}
Here is the crash log:
0 libicucore.A.dylib 0x34c00578 ucnv_close + 28
1 libxml2.2.dylib 0x342a81ba xmlCharEncCloseFunc + 30
2 libxml2.2.dylib 0x342c62d0 xmlFreeParserInputBuffer + 28
3 libxml2.2.dylib 0x342aacbc xmlFreeInputStream + 108
4 libxml2.2.dylib 0x342aace4 xmlFreeParserCtxt + 12
5 Foundation 0x37d14b22 -[NSXMLParser dealloc] + 158
请帮我解决此问题。
答案 0 :(得分:1)
您正在释放解析器并在parse
方法之后设置其委托nil。
解析也在内部进行,所以你必须等待解析得到结束。
您可以设置一些通知或调用方法,以便在parserDidEndDocument
方法中释放解析器。
希望这有帮助。
答案 1 :(得分:1)
我遇到了类似的问题,似乎是因为我正在混合NSXMLParser
以及访问libxml的其他代码 - 一个使用wsdl2objc生成的SOAP客户端。两者都在同一个线程中,但是如果一个的生命周期与另一个重叠,那么我得到的崩溃和堆栈跟踪完全相同。通过仔细控制两个变体的寿命,它解决了我的问题。
我相信我遇到的问题是由于NSXMLParser
与SOAP客户端代码调用xmlInitParser的方式不同,尽管我还没有验证过。
另外值得一提的是我正在使用ARC,(虽然我选择将包含类的NSXMLParser转移到非ARC主要协助调试) - 基本SDK 5.1 / 6,部署目标为4.0
另一方面,Colin-C撰写了一篇关于构建线程安全版libxml的优秀文章here。
希望能帮助你或其他人绊倒这个。