NSXMLParser "elementName" преждевременно освобожден в didStartElement: метод протокола

Я использую подкласс NSXMLParser более шести месяцев без проблем в Snow Leopard. Когда я портировал на Mavericks, неожиданно у меня начались странные сбои в середине операции импорта. Я использовал Zombies, чтобы увидеть, в чем проблема, и оказалось, что параметр elementName в методе протокола NSXMLParser освобождается преждевременно. Вот метод.

- (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 responsedsToSelector:]: сообщение отправлено освобожденному экземпляру 0x600000c326c0

Запустив Zombies, я получаю: elementName NSString * имя класса = _NSZombie_CFString 0x0000600000c326c0

Таким образом, кажется, что elementName превращается в строку Zombie. Я никогда не изменяю elementName, так как это параметр, предоставленный методом протокола. Остальные мои методы протокола довольно стандартны.

Как ни странно, точно такой же код, кажется, отлично работает на тех же данных в El Capitan, но сейчас мне нужно работать в Mavericks. Кроме того, это случается с некоторыми данными, но не с другими, даже если все данные представляют собой прямой XML и в прошлом многократно использовались без проблем. Кто-нибудь знает, что происходит? Может ли это быть странной проблемой конфигурации, характерной для Mavericks. Спасибо за помощь.

1 ответ

Хорошо, это несколько неудовлетворительно, но я "решил" проблему, переключившись на ARC. Кажется, что импорт теперь работает нормально, пока я не запускаю его в фоновом режиме.

Это на самом деле не объясняет, как мой парсер мог остаться в памяти, но переменная Apple elementName была освобождена.

Другие вопросы по тегам