0

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

请帮我解决这个问题。

4

2 回答 2

1

您正在释放解析器并在方法之后设置其委托 nil parse。解析也在内部后台进行,因此您必须等待解析结束。

您可以在方法中设置一些通知或调用方法来释放解析器parserDidEndDocument

希望这可以帮助。

于 2012-08-14T11:45:15.213 回答
1

我遇到了类似的问题,这似乎是因为我正在NSXMLParser与访问 libxml 的其他代码混合 - 使用 wsdl2objc 生成的 SOAP 客户端。两者都在同一个线程中,但是如果一个线程的生命周期与另一个线程重叠,我会得到与您完全相同的崩溃和堆栈跟踪。通过仔细控制这两个变体的生命周期,它解决了我的问题。我相信我遇到的问题是由于NSXMLParser与 SOAP 客户端代码调用 xmlInitParser 的方式不同,尽管我尚未对此进行验证。

还值得一提的是,我正在使用 ARC,(尽管我选择将包含类的 NSXMLParser 转移到主要协助调试的非 ARC) - 基础 SDK 5.1 / 6,部署目标为 4.0

附带说明一下,Colin-C在这里有一篇关于构建 libxml 的线程安全版本的优秀文章。

希望能帮助您或其他人偶然发现这一点。

于 2012-08-20T20:50:00.517 回答