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 была освобождена.