2009-03-26 1 views
3

[파서 릴리스]에서 간헐적 인 충돌이 발생합니다. 나는 시간의 약 5 %를 볼 것이라고 말하고 싶습니다. 그리고 파싱 할 데이터는 각 충돌마다 다릅니다. 나는 왜 내 인생에 대해 생각할 수 없다.NSXMLParser를 해제 할 때 EXC_BAD_ACCESS에서 충돌이 발생합니다.

버그 보고서를 제출하기 (필자의 행운과 함께 샘플 코드로 재생산되지 않음) 누구에게이 문제가 발생했는지, 그리고 무슨 일이 일어날 지 알고 있습니까?

NSData *d = [data copy]; // data is typically 2K-13K bytes 
    @synchronized (xmlParserLock) { 
     [[NSURLCache sharedURLCache] setMemoryCapacity:0]; 
     [[NSURLCache sharedURLCache] setDiskCapacity:0]; 

     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
     NSXMLParser *parser = [[NSXMLParser alloc] initWithData:d]; 
     [parser setDelegate:self]; 
     [parser setShouldProcessNamespaces:NO]; 
     [parser setShouldReportNamespacePrefixes:NO]; 
     [parser setShouldResolveExternalEntities:NO]; 
     [parser parse]; 
     [parser release]; 
     [pool release]; 
    } 
    [d release]; 

그리고 여기에는 GDB의 '어디에'[파서 릴리스]를 가리키는 출력 : 사전에 어떤 도움

#0 0x93d08d12 in xmlCharEncCloseFunc() 
#1 0x93cfc0e3 in xmlFreeParserInputBuffer() 
#2 0x93cfc08f in xmlFreeInputStream() 
#3 0x93cfbdac in xmlFreeParserCtxt() 
#4 0x961384d6 in -[NSXMLParser dealloc]() 
#5 0x00149de7 in -[MyParserClass parseResponse] (self=0x104e9f0, _cmd=0x1766dc) at /Users/mike/Documents/MyApp/Classes/MyParserClass.m:60 

감사합니다!

+0

는 MyParserClass 여기에 표시하고있는 방법 조각, 그리고 [파서 릴리스] 라인 60에? –

+0

브렌트 : 맞습니다. –

답변

4

내가 그것을 알아 냈다고 생각 응용 프로그램에서 다른 몇 가지 코드는 다음과 같은 XML 기능을 사용하여 . NSXMLParser는 분명히 동일한 기능을 후드에서 사용합니다.

NSXMLParser 사용에 사용하는 잠금 객체와 동일한 잠금 객체를 사용하여 다른 블록에 동기화 된 블록을 추가했는데 충돌이 사라진 것처럼 보입니다. 그래서 여기서의 교훈은이 XML 함수가 스레드로부터 안전하지 않다는 것입니다 -주의해서 사용하십시오!

0

여러 스레드를 사용하고있는 것 같습니다. 거기에 문제가있을 수 있습니다. 스레딩 버그는 종종 간헐적으로 나타납니다. 또한 여기에 게시하지 않은 파서 위임 메서드에 버그가있을 수 있습니다. 이 기능은 가능성이 동시에 다른 스레드에서 실행되는

xmlCtxtReadMemory() 
xmlClearParserCtxt(); 
xmlFreeParserCtxt(); 
xmlCleanupParser(); 
xmlFreeDoc(); 

내가 게시 된 코드 부분을 실행하고있다 : -

+0

NSXMLParser가 다중 스레드와 잘 작동하지 않는다는 것을 읽었습니다. 그렇습니다. 할당과 할당 해제를 동기화했습니다. NSXMLParser에 관한 한, 이것은 문제의 다중 스레드 각도를 제거해야한다고 생각합니다. –

+0

델리게이트 메서드는 NSXMLParser를 할당 해제 할 때 잘못된 액세스가 발생하는 이유와 관련이있는 작업을 볼 수 없습니다. 꽤 이상 하네. 귀하의 의견에 감사드립니다. –

0

구문 분석이 완료 될 때만 데이터를 삭제해야합니다. parserDidEndDocument라는 대리자 메서드에서 데이터를 릴리스합니다.

희망 도움말.

thierry

0

구문 분석이 완료되면 데이터를 삭제해야합니다. parserDidEndDocument라는 대리자 메서드에서 데이터를 릴리스합니다.

희망 도움말.

티에리