我已经使用 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 并且过去曾多次使用过,没有任何问题。有谁知道发生了什么?这可能是小牛队特有的奇怪配置问题吗?谢谢您的帮助。