【问题标题】:NSXMLParser "elementName" deallocated prematurely in didStartElement: protocol methodNSXMLParser“elementName”在 didStartElement 中过早地释放:协议方法
【发布时间】:2016-05-13 08:55:05
【问题描述】:

我已经使用 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:]: 消息发送到已释放实例 0x600000c326c0

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

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

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

【问题讨论】:

    标签: nsxmlparser elementname


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-04-18
      • 1970-01-01
      • 1970-01-01
      • 2014-03-11
      • 2015-08-01
      • 1970-01-01
      • 2012-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多