XMLParser版本在后台线程iOS 5.1.1中崩溃

时间:2012-08-14 11:27:26

标签: iphone ios

在我的应用程序中,我在后台线程中从服务器下载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

请帮我解决此问题。

2 个答案:

答案 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

希望能帮助你或其他人绊倒这个。