2011-08-24 4 views
1
NSURL *url = [[NSURL alloc] initWithString:@"http://www.someurl.com/sample.xml"]; 
xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url]; 
[url release]; 

XMLParser *parser = [[XMLParser alloc] initXMLParser];  //50.0% 


[xmlParser setDelegate:parser]; 
parser = nil; 
[parser release]; 

[xmlParser parse];           //50.0% 
[xmlParser release]; 

이것은 내 파싱 코드이며 누출 장비에 누출이 표시됩니다. 나는 무엇이 잘못되었거나 이것을 고치는 법을 모른다. 어떤 제안?XMLParser 누수 도구 유출

답변

2

NSXMLParser를 사용하여 비슷한 문제가 있었지만 메모리 누수를 해결하기위한 쉬운 수정 방법을 발견했습니다. `[파서 대신 나는 내 기억을 제거 할 수 있었다 다음

NSData *xmlData = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]]; 
xmlParser = [[NSXMLParser alloc] initWithData:xmlData]; 

를 수행

xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url]; 

을하는

3
parser = nil; 
[parser release]; 

... 이것은 당신이 생각하는대로하지 않습니다. parser을 가정하면, self.parser = nilparser = nil은 매우 다른 일을합니다. 전자는 parser setter 메서드를 호출합니다.이 메서드는 이전 값을 해제하고 속성을 nil로 설정합니다. 후자는 포인터를 현재 위치에서 nil로 변경합니다.

포인터를 nil로 설정하면 개체에 대한 참조가 손실되어 이전에 할당 된 개체가 누출되었습니다. 기본적으로 nil 개체를 해제하려고합니다. nil 통화를 삭제하거나 release (아래 참조) 다음에 전화를 걸어야합니다.

이후에 포인터를 nil으로 설정하여 문제가 발생하지 않도록하고 향후 어느 시점에서 시도해보십시오. 여기

은 일부 내용을 제공하기 위해 몇 가지 다른 질문입니다

release Vs nil -- Best Practice

Difference between release and release then set to nil

+0

내가 한 라이너로 다시 것이다 누수 release], 파서 = nil;'. 로컬 범위이지만, 포인터를'nil'에 설정하는 것은 실제로 필요하지 않습니다. – Joost

+0

실제로 - 개인적으로, 나는 로컬 변수가 아닌 nil으로 속성을 설정합니다. 그리고 Simon이 그의 대답에서 말했듯이, 파서와의 누출 문제는 해결되지 않습니다! – lxt

0

파서의 누출에 대한 similar post here있다. 나는 또한이 문제가있다. 짜증나지만 큰 누출이 아니므로 걱정하지 않아도됩니다. iOS 5가 문제를 해결했는지 알 수 있습니다 (실제로 누설 된 경우).

편집 : 이제 위의 실수를했는지 확인하고 싶습니다.

+0

그래서 나는 그것을 꿀벌에게 남겨 둘 것을 제안합니다. 내 응용 프로그램을 유출로 둡니다? – Spire