2012-04-26 1 views
0
if ([elementName isEqualToString:@"type"]) 
    { 
     items  = [[NSMutableDictionary alloc] init]; 
     currentname = [[NSMutableString alloc] init]; 
     currentid = [[NSMutableString alloc] init]; 
    } 

당신은이 인스턴스 변수에 저장된 이전 값을 누설 문제누출 위치는 어디입니까? 알아낼 수 할 수있는 방법

+2

Xcode의 정적 분석기를 실행하려고 했습니까? 증상은 무엇입니까? 악기를 사용해 보셨습니까? – Romain

+0

당신은 의미있는 대답을 좀 더 많은 문맥을 제공해야 할 것입니다. 이 iVar가 클래스에 있습니까? 아니면 이러한 로컬 변수가 메서드/함수에 있습니까? 나중에 무엇을합니까? – FelixLam

답변

2
currentElement = [elementName copy]; 
items   = [[NSMutableDictionary alloc] init]; 
currentname = [[NSMutableString alloc] init]; 
currentid  = [[NSMutableString alloc] init]; 

에게 누설.

+0

예 새로운 값의 모든 클립을 XML 데이터 파일에서 읽음으로써 오래된 valeus를 분쇄 한 이유는 무엇입니까? –

+0

@ B.Moahmmed.Amine 이전 값에 대해서는 다음을 수행 할 책임이 없습니다. 작성한 이후에 릴리스하십시오. – Hailei

0

이 스 니펫에 누출이 있다는 것을 알고 있다면, NSString 객체 "elementName"이 유출되었다고 말한 Instrument를 이미 실행했다고 가정합니다.

로맹 말이 맞습니다. Xcode 정적 분석기를 실행하는 것이 좋습니다. [elementName copy]은 보유 수 +1의 개체를 반환한다고 알려줍니다. (코코아 규칙에 따라, 모든 "복사"선택자는 반환 된 객체의 소유권을 코드로 전송합니다.)

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict 
{ 
    [currentElement release]; 
    currentElement = [elementName copy]; 

    // your method body here… 
} 
+0

나는 [currentElement release]를 쓰고있다; 그러나 같은 문제.나는 여기에 내 문제를 생각 - (무효) parseXMLFileAtURL : (있는 NSString *) URL { \t donnes의 = [[NSMutableArray를 alloca 함수] 초기화] \t xmlURL = [NSURL URLWithString : URL]; \t XmlParser가 = [NSXMLParser alloca를] initWithContentsOfURL : xmlURL]; \t [xmlparser setDelegate : self]; \t [XmlParser가 된 setShouldProcessNamespaces : NO] 없다 \t [XmlParser가 된 setShouldReportNamespacePrefixes : NO] 없다 \t [XmlParser가 된 setShouldResolveExternalEntities : NO] 없다 \t [xmlparser parse]; \t } –

1
  • currentElement = [elementName copy];
  • items = [[NSMutableDictionary alloc] init];
  • currentname = [[NSMutableString alloc] init];
  • :

    그래서 여기에 솔루션을 사용, 필요하지 않은 경우 복사 된 개체를 해제하여 "복사"전화 균형을하는 것입니다

  • currentid = [[NSMutableString alloc] init];

parser:didStartElement:namespaceURI:qualifiedName:attributes: 메서드를 두 번 이상 실행하면 이러한 모든 메모리 누수가 발생합니다.

이 문제를 해결하는 가장 쉬운 방법은 변수를 속성으로 변경하는 것입니다. 예를 들어, 헤더 파일의 변경 :

@interface SomeClass { 
    NSMutableDictionary *items; 
} 

에 :

@interface SomeClass { 
} 

@property (retain) NSMutableDictionary *items; 

그리고 것은 @implementation SomeClass 후이 추가 :

self.items = [[[NSMutableDictionary alloc] init] autorelease]; 
:

@synthesize items; 

그런 다음에 원래의 코드를 변경

B 메모리 문제를 점검하고 싶을 때 Xcode와 Instruments의 "Analyze"기능이 여러분의 친구입니다.

관련 문제