При синтаксическом анализе NSXMLParser не удается вызвать делегат в первый раз ... Но работает после перезапуска задачи приложения iPhone - PullRequest
0 голосов
/ 25 февраля 2011

У меня странная проблема. я использую NSXMLParser для анализа моих данных XML, которые выбираются из сети. Несмотря на то, что вызов parse возвращает успех, функции делегата не запускаются при первом запуске приложения iPhone. Но точно такой же XML отлично разбирается с обратными вызовами делегатов, вызываемыми правильно, когда я перезапускаю процесс (iPhone4 работает на iOS4.2), убив фоновую задачу и перезапустив приложение. Точно такое же поведение в симуляторе и телефоне.

NSXMLParser *lxmlParser = [[NSXMLParser alloc] initWithData:jData];
MyXMLParser *pxmlParser = [MyXMLParser initXMLParser];
[lxmlParser setDelegate:pxmlParser];

BOOL success = [lxmlParser parse];

Вместо того, чтобы убивать фоновую задачу, если я просто перенесу приложение в фоновый режим и выведу обратно на передний план, проблема остается. Единственный обходной путь - убить бегущего фоновая задача (да, моя - это фоновая задача, слушающая «значительное изменение местоположения») и перезапустить приложение. Отныне разбор работает нормально ...

Может кто-нибудь, пожалуйста, помогите?

1 Ответ

0 голосов
/ 25 февраля 2011

Какое определение для [MyXMLParser initXMLParser]?Если вы следуете руководству Какао по управлению памятью (и вы должны это делать!), Он вернет объект, который автоматически освобожден (поскольку он не начинается с 'alloc', 'new', 'copy').Так где же этот объект хранится навсегда?Если он не сохранен, он может преждевременно выгружаться из памяти при выходе из текущего пула автоматического выпуска.

Кстати, я бы выбрал более подходящее имя для вашего метода построения автоматического выпуска - метод, начинающийся с 'init'это на самом деле не метод инициализации сбивает с толку.Переименование intXMLParser просто в xmlParser может быть хорошей идеей, стилистически.

Кроме того, вы назвали класс реализации XMLParserDelegate как «thingXMLParser ».Лучшим выбором было бы что-то вроде'thingXMLParserDelegate '.

...