2011-02-23 2 views
2

업데이트 : 누설 도구가 [parser parse];의 첫 번째 호출을 가리키는 동안이 호출을 두 번째로 수행 할 때만 누수가 발생한다는 것을 확인했습니다. NSXMLParser 클래스 참조 또는 설명서에서 아무것도 다시 구문 분석 할 수 없다는 것을 알 수 없습니다. 내가 놓친 게 있니? 문서를 파싱 할 때마다 새 NSXMLParser를 만들어야합니까?두 번째 구문 호출에서 NSXMLParser 메모리 누수가 발생했습니다.

현재 iPhone 응용 프로그램 용 코드를 파싱하는 XML에서 누출을 추적하려고합니다. NSXMLParser를 사용하여 누수에 대한 다른 게시물을 검색했지만 사용할 수있는 답변을 찾지 못해서 도움을 주시면 감사하겠습니다.

NSData* data = [NSData dataWithContentsOfFile: [[NSBundle mainBundle] pathForResource: @"collisionGraph" ofType: @"graphml"]]; 
NSXMLParser* parser = [[[NSXMLParser alloc] initWithData: data] autorelease]; 
[parser setDelegate:self]; 
[parser parse]; <<<<< leak here according to Leaks 
self.currentPass++; 

... 

[parser parse]; 
self.currentPass++; 

내가 내 대리인 콜백 메소드에서 코드를 모두 제거하지만, 이것은 누출을 멈추지 않았다 :

는 악기 누수 도구는 다음 코드에서 누출을 감지한다. 여기

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
namespaceURI:(NSString *)namespaceURI 
qualifiedName:(NSString *)qualifiedName 
    attributes:(NSDictionary *)attributeDict 
{ 
} 

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 
} 

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
namespaceURI:(NSString *)namespaceURI 
qualifiedName:(NSString *)qName 
{ 
} 

(나는 이미지를 게시 할 수있는 담당자가 없기 때문에 연결) 악기 http://i22.photobucket.com/albums/b311/Erithil/ParserLeak.png에서보기입니다.

저는 정말이 문제에 곤란을 겪었습니다. 미리 감사드립니다.

+0

NSXMLParser 객체에서 release는 어디에서 호출합니까? 디버거 또는 로깅 문을 사용하여 릴리스를 호출하는 코드가 실제로 실행되고 있는지 확인할 수 있습니까? - [NSXMLParser parse]는 파서가 할당 해제 될 때 정리가 필요한 메모리를 할당 할 수 있습니다. – Ryan

+0

@ 라이언 고마워 라이언. 필자의 동료 중 한 명은 autorelease 풀이 적시에 릴리스되지 않을 수 있기 때문에 파서가 누출되었을 수도 있다고 제안했습니다. 필자는 'autorelease'호출을 '[parser release]'호출로 대체하여 테스트했습니다. 방법의 끝에서. 디버거를 사용하여 릴리스 콜이 진행되고 있음을 확인했습니다. 그럼에도 불구하고 누출은 여전히 ​​존재했다. 나는 – Dan

답변

1

(예 : xmlCleanupParser()가 기본 libxml에서 호출되지 않은 경우) NSXMLParser에서 누수가 발생하거나 실수로 누출로 플래그 된 재사용 가능 메모리가 될 수 있습니다. 필자는 할당 된 메모리를 재사용 (그리고 적절하게 배포하지 않음)했기 때문에 파서가 일반적으로 발생한다고 생각합니다.

+0

를 본다. 누수가 실제인지 여부를 단호하게 판단 할 수있는 방법이 있습니까 (누수에 무시하지 말라고 말하지 않으면), 아니면 별도의 NSXMLParser 객체를 사용하여 해결해야합니까? 감사. – Dan

+0

해결 방법을 사용하는 것이 최선의 방법이라고 생각합니다. –

+0

NSXMLParser에는 문서를 두 번 구문 분석하도록 요구하는 조항이 없다고 생각합니다. 기대는 당신이 생성하고 파싱 한 다음 파괴하는 것입니다. – Ryan

관련 문제