2011-07-14 28 views
1

我想解析一個xml文件。我正在創建一個字典數組,然後用這些創建的數組創建數組。當我將nsdictionary複製到數組中時,發生內存泄漏。可以任何人請幫助! 感謝解析數據時內存泄露

enter image description here

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

if(parseMode == 1){ 
    //  NSLog(@"found this start tag: %@", elementName); 
    if ([elementName isEqualToString:@"Group"]) { 
     [tInState removeAllObjects]; 
    } 
    else if ([elementName isEqualToString:@"State_Name"]) { 
     tData = [[NSMutableDictionary alloc] init]; 
     xmlItem = 0; 
    } 
    else if ([elementName isEqualToString:@"T_Name"]) { 
     xmlItem = 1; 
    } 
    else if ([elementName isEqualToString:@"T_Address"]) { 
     xmlItem = 2; 
    } 
    else if ([elementName isEqualToString:@"T_Ph"]) { 
     xmlItem = 3; 
    } 
} 

}

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

if (parseMode == 1) { 
    // NSLog(@"found this end tag: %@", elementName); 
    if([elementName isEqualToString:@"T_Info"]) {    
     [tInState addObject:[tData copy]]; 
     [tData autorelease]; 
    } 
    else if ([elementName isEqualToString:@"Group"]) { 
     [tlist addObject:tInState]; 

    }      
} 

}

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

if (parseMode == 0) { 
    [self addToStateList:string]; 
} 
else if (parseMode == 1) { 
    //  NSLog(@"found this character: %@", string); 
    switch (xmlItem) { 
     case 0:    
      [tData setValue:string forKey:@"State_Name"]; 
      break; 
     case 1:    
      [tData setValue:string forKey:@"T_Name"]; 
      break; 
     case 2:    
      [tData setValue:string forKey:@"T_Address"]; 
      break; 
     case 3:    
      [tData setValue:string forKey:@"T_Ph"]; 
      break; 
     default: 
      break; 
    }   
} 

}

這裏tInState,tInState是nsmutab學習我在viewdidload函數中分配的內容並在releaseMemory中發佈。我瀏覽了NScopy文檔,它說當我們使用副本時,所有權被轉移。我釋放我的所有數組,爲什麼它仍然導致問題?

請幫忙。 謝謝

+0

我錯過了清除didendelement中的行我不釋放nsdictionary(tdata)。如果我釋放它剛剛崩潰。 – pa12

+0

請粘貼代碼並擺脫屏幕截圖(難以閱讀) –

+0

考慮轉換爲ARC,這些問題會消失。 – Cthutu

回答

0

在線81你正在創建一個tData的副本,但不會釋放它,因此它泄漏。不要在addObject調用中創建副本,而是將其分配給一個變量,然後將其傳遞給addObject,然後釋放它。

id temp = [tData copy]; 
[tInState addObject:temp]; 
[temp release]; 

此外,我假設[tData autorelease]實際上是爲了釋放副本。如果是這樣,那沒有必要。

+2

或者只是使用'[[tData copy] autorelease]'。這也起作用。 ;) –

+0

@Jonathan - 當然,但如果你知道你不再需要它,那麼把它放入autorelease池並沒有多大意義。 – highlycaffeinated

+1

是的,但它更短,更乾淨的代碼,可以讓你跳過創建一個臨時的。 '-autorelease'的開銷非常低 - 避免它過早優化。 –

1

你泄漏的原因是因爲tData正在做你告訴它的內容,並返回一份副本。在下一行的tData上調用autorelease會自動釋放原始的tData,並導致過度釋放。您需要將該行更改爲[tInState addObject:[[tData copy] autorelease]];,並在下一行刪除autorelease呼叫。