2011-10-18 6 views
0

나는 통계 모니터 응용 프로그램을 구축 중이며 XML 파서를 사용하여 데이터를 검색하고 있습니다. obj-c의 메모리 관리 및 retainCount 등에 관한 많은 연구, 학습 및 읽기가 있지만 Instruments에서 메모리 누수가 발생합니다.메모리 관리 누수 문제를 해결하는 방법

for(int counter = 0; counter < [resultElement childCount]; counter++) { //Loop trough the childs 
     //Instruments Leaks tells me that I have 75% leaks here 
     [entryItem setObject:[[resultElement childAtIndex:counter] stringValue] forKey:[[resultElement childAtIndex:counter] name]]; 
    } 

    //Instruments Leaks tells me that I have 25% leaks here 
    [totalEntries addObject:[entryItem copy]]; //Copy it into the MutableArray 

XML 파서에서 메모리 누수가 발생하지만 누출 문제를 해결하는 방법을 모르겠습니다.

- (NSString *)stringValue { 
if (_node->type == XML_TEXT_NODE || _node->type == XML_CDATA_SECTION_NODE){ 
    return [NSString stringWithUTF8String:(const char *)_node->content]; //16.7% leaking 
} 

if (_node->type == XML_ATTRIBUTE_NODE){ 
    return [NSString stringWithUTF8String:(const char *)_node->children->content]; //50.0% leaking 
} 

NSMutableString *theStringValue = [[[NSMutableString alloc] init] autorelease]; 
for (CXMLNode *child in [self children]) { 
    [theStringValue appendString:[child stringValue]]; //33.3% leaking 
} 

return theStringValue; 

}

[totalEntries addObject:[entryItem copy]]; 

당신이 개체를 복사 라인에서

답변

9

는, 다시는 유지 증가하는 totalEntries에 추가 (따라서 새로운 객체는 하나의 수를 유지있다) 카운트. 당신은 석방을 놓쳤습니다.

[totalEntries addObject:[[entryItem copy] autorelease]]; 

또는

NSObject* copiedItem = [entryItem copy]; 
[totalEntries addObject:copiedItem]; 
[copiedItem release]; 

당신은이에 대한 통찰력을 얻을 수있는 정적 분석기를 사용할 수 있어야합니다. 그리고 ARC가 나오면 곧 걱정할 필요가 없습니다 (비록 어쨌든 그것을 이해하는 것이 유용 할지라도). 당신이 완전한 세부 사항에 관심이 가능한 누수의 모든 종류의 여기가 해결되면

+0

설명 아주 좋은 분명! –

+0

흠, 이미 addObject 함수에서 entryItem을 릴리스 했으므로 예제에서 실수를 한 것 같습니다. 문제는 내가 게시 한 두 번째 예에서 실제로 발생합니다. – Leon

+0

은 totalEntries가 사용자 지정 개체 또는 컬렉션입니까? – jbat100

2
+0

+1 모호한 조언을 제공하는 것을 제외하면 이들은 훌륭한 링크 모음입니다. 공유해 주셔서 감사합니다. – Rob

관련 문제