NSXMLParser" elementName"在didStartElement:protocol方法中过早释放

时间:2016-02-03 22:47:17

标签: nsxmlparser elementname

我一直在使用NSXMLParser子类超过六个月而Snow Leopard没有任何问题。当我移植到小牛队时,突然间,我开始在导入操作中遇到奇怪的崩溃。我使用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){检查和随后的NSLog语句只是为了帮助查明错误而添加,因为在此之前我只知道它在didStartElement崩溃了:。]

我得到的错误信息是: *** - [CFString respondsToSelector:]:发送到解除分配的实例的消息0x600000c326c0

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

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

奇怪的是,完全相同的代码似乎在El Capitan完全相同的数据上工作正常,但是现在我需要在Mavericks工作。此外,它发生在一些数据而非其他数据,即使数据都是直接的XML并且过去已经多次使用而没有问题。有谁知道发生了什么事?这可能是特定于Mavericks的奇怪配置问题。谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

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

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