2010-07-25 3 views
1

NSXMLParser가 XML이 포함 된 오류를 구문 분석 할 때 다른 사람이 iPhone 라이브러리에서 다운되는 경우가 있습니까?오류가있는 XML에서 NSXMLParser가 충돌하지만 오류 처리가 올바르지 않습니까?

  • (무효) 파서 : (NSXMLParser *) 파서 parseErrorOccurred : (NSError *) parseError

를 대신 그것은 _xmlRaiseError 내부 어딘가에 전체 응용 프로그램 충돌 나는 그것이 전화를했는데 생각했다.

다른 사람이이 프로그램을 사용하는 대신 프로그램을 중단시키는 대신이 프로그램을 사용하는 방법이 있습니까?

답변

0

나는 이것을 버그 신고로 제출했고 애플은 1 년 후 iOS5에서 수정해야한다고 대답했다.

0

모든 종류의 조작 된 XML을 처리해야하는 경우 @try/@catch을 사용하여이를 감쌀 수 있어야합니다.

+0

나는 이것을 시도했지만 도움이되지 않습니다. 던져 예외가 없습니다 그리고 나는 그것을 잡을 수 없다 : –

0

XML 파서는 절대로 충돌하지 않지만 제 처리기가 충돌합니다. 예를 들어 < foo />를 얻은 다음 그 값을 배열 (nil, boom)에 저장하려고합니다. 다음은 내가 사용한 대리자를 사용하여 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 파서의 위임자입니다.

업데이트 : 0ops, 그래서 내 < foo />을 (를) 파싱했습니다.

0

아마도 문제는 XML 문자열이 parseErrorOccurred가 호출되기 전에 autoreleased되면서 dealloc 된 객체를 호출하기 때문일 수 있습니다.

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 구문 분석 호출하여 충돌이 발생할 수 있습니다 : 서식이 부족하여 죄송합니다, 그것을 보이는 코드 앞에 공백으로 작동시키지 수 없습니다)

 @try { \t [parser parse]; } @catch (NSException * e) { NSLog(@"Parse error"); NSString * str = [[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding] autorelease]; NSLog(str); } 
기존의 구문 분석 루프에서). 구문 분석 루프 내에서 TTStyledText 개체를 만들 때이 문제가 발생했습니다 (TTStyledText는 NSXMLParser를 만듭니다). 이로 인해 예측할 수없는 누수가 발생했으며 문자열을 배열에 저장하고 TTStyledText 객체/after/parsing을 작성하여 해결되었습니다. –

1

오류 처리가 TouchXML 프레임 워크 또는 CXMLDocument에서 발견되지 :

이 솔루션은 같은 것으로 할 것입니다. libxml 프레임 워크에서 (내 지식으로) 문자열을 출력하지만 예외는 발생시키지 않습니다. 따라서 오류 포인터를 전달한 후 곧바로 읽는 것이 전부입니다. nil이 아니면 오류가 발생했습니다. 당신이 충돌을 얻는다면 그 오류는 어딘가에 있어야합니다 ... 희망이 도움이됩니다.

관련 문제