0

我已经使用 NSXMLParser 子类超过六个月了,在 Snow Leopard 中没有任何问题。当我移植到 Mavericks 时,突然间,我开始在导入操作中遇到奇怪的崩溃。我使用 Zombies 来查看问题所在,并且似乎 NSXMLParser 的协议方法中的 elementName 参数被过早地释放。这是方法。

- (void) parser: (SmartParser *) parser
didStartElement:(NSString *)elementName 
   namespaceURI:(NSString *)namespaceURI 
  qualifiedName:(NSString *)qName 
     attributes:(NSDictionary *)attributeDict
{
    if (nil != elementName) {
        NSLog(@"STARTING: elementName is %@\n", elementName); // <= error here
        if ([elementName isEqualToString: @"Root"]) {

[ 下面是对 elementName 值的一系列检查。而且,顺便说一句,添加 if (nil != elementName) { check 和随后的 NSLog 语句只是为了帮助查明错误,因为在此之前我只知道它在 didStartElement: 处崩溃。]

我得到的错误信息是:*** -[CFString respondsToSelector:]: message sent to deallocated instance 0x600000c326c0

运行僵尸,我得到: elementName NSString * class name = _NSZombie_CFString 0x0000600000c326c0

所以看起来 elementName 变成了一个僵尸字符串。我从不修改 elementName 因为它是协议方法提供的参数。我的其余协议方法非常标准。

奇怪的是,完全相同的代码似乎可以在 El Capitan 中完全相同的数据上正常工作,但现在我需要在 Mavericks 工作。此外,它会发生在某些数据上,但不会发生在其他数据上,即使这些数据都是纯 XML 并且过去曾多次使用过,没有任何问题。有谁知道发生了什么?这可能是小牛队特有的奇怪配置问题吗?谢谢您的帮助。

4

1 回答 1

0

好的,这有点令人不满意,但我已经通过切换到 ARC 来“解决”这个问题。只要我不在后台操作中运行它,导入现在似乎工作正常。

它并没有真正解释我的解析器如何保留在内存中,但 Apple 的 elementName 变量正在被释放。

于 2016-02-04T05:01:29.113 回答