2010-07-25 3 views
1

Кто-нибудь еще сталкивается с серьезными сбоями в библиотеках iPhone, когда NSXMLParser анализирует xml-содержащие ошибки? Я думал, что он должен был назвать:NSXMLParser сбой при неисправности xmls, правильная обработка ошибок?

  • (аннулируются) анализатор: (NSXMLParser *) анализатор parseErrorOccurred: (NSError *) parseError

, но вместо этого он выходит из строя все приложения где-то внутри _xmlRaiseError.

Неужели кто-то еще испытывает это, и есть ли способ поймать это, вместо того, чтобы сбой моей программы?

ответ

0

Я подал это как отчет об ошибке, и Apple ответила мне через год, чтобы сказать, что она должна быть исправлена ​​в iOS5.

0

Вы должны иметь возможность использовать @try/@catch, чтобы обернуть это, если вам нужно обрабатывать все виды искаженных XML.

+0

Я пробовал это, но это не помогает. нет никакого исключения, и я не могу его уловить:

 @try { \t [parser parse]; } @catch (NSException * e) { NSLog(@"Parse error"); NSString * str = [[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding] autorelease]; NSLog(str); } 
(извините за отсутствие форматирования, он не может заставить его работать с пробелами перед кодом) –

0

Анализатор XML никогда не сбой для меня, но мои обработчики иногда рушились. Например, если я получаю < foo /> и попытаюсь сохранить его значение в массиве (ноль, стрела). Ниже приводится точный код, который я использую, который анализирует XML, используя делегат, который я сделал.

NSData *data = [[NSData alloc] initWithContentsOfFile:filename]; 
NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:data]; 
MGXMLParser *parser = [[MGXMLParser alloc] initWithRecipient:self]; 
[xmlParser setDelegate:parser]; 
BOOL success = [xmlParser parse]; 
if (success) { 
    NSLog(@"No errors"); 
} else { 
    NSError *error = [xmlParser parserError]; 
    NSLog(@"Errors with xmlParser: %@", [error localizedDescription]); 
} 
[parser release]; 
[xmlParser release]; 
[data release]; 

MGXMLParser мой собственный класс, который является делегатом для XML-парсер, в случае, если это не было очевидно.

Обновление: oops, SO проанализировал мой < foo /> в ничто.

0

Проблема, вероятно, в том, что ваша строка XML получает автореализацию перед вызовом parseErrorOccurred, вызывающим вызов объекта dealloc'd.

Решение сделать что-то вроде:

NSData *data = [[contentString dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES] retain]; //use a retain, to stop data being autoreleased 

NSXMLParser* xmlParse = [[NSXMLParser alloc] initWithData:data]; 

[xmlParse setDelegate:self]; 

[xmlParse parse]; 

[data release]; //now release data 
[xmlParse release]; 
+0

Сбои также могут быть вызваны вложенным разбором (т. е. вызывать синтаксический анализ NSXMLParser а в существующем цикле анализа). У меня была эта проблема, когда я создавал объекты TTStyledText в цикле синтаксического анализа (TTStyledText создает NSXMLParser). Это вызвало непредсказуемые утечки и было исправлено путем сохранения строк в массиве и создания объектов TTStyledText/после/синтаксического анализа. –

1

Обработка ошибок не найдено в рамках TouchXML или в CXMLDocument. Именно в структуре libxml, которая, насколько мне известно, выводит строку, но не вызывает исключение. Так что это все о передаче указателя ошибки, а затем чтение его сразу после. Если это не ноль, произошла ошибка. Если вы получаете аварии, ошибка должна быть где-то еще ... Надеюсь, что это поможет.

Смежные вопросы