2

我無法從我正在處理的iPhone應用程序中移除泄漏。我正在解析一個XML feed來獲取數據。 這裏是我使用的解析解析xml時NSCFString appendString泄漏

[[NSURLCache sharedURLCache] setMemoryCapacity:0]; 
    [[NSURLCache sharedURLCache] setDiskCapacity:0]; 
    NSData *xml = [NSData dataWithContentsOfURL: [NSURL URLWithString:@"url link"]]; 
    self.parser = [[NSXMLParser alloc] initWithData:xml]; 


[self.parser setDelegate:self]; 
[self.parser parse]; 
[self.parser release]; 
self.parser=nil; 

代碼和解析代碼

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { if(![elementName compare:@"item"]) 
{tempElement = [[XMLElement alloc] init]; 
} 
else if(![elementName compare:@"title"]) 
{ 
    self.currentAttribute = [NSMutableString string]; 
} 

else if(![elementName compare:@"link"]) 
{ 
    self.currentAttribute = [NSMutableString string]; 
} 
else if(![elementName compare:@"comments"]) 
{ 
    self.currentAttribute = [NSMutableString string]; 
} 
else if(![elementName compare:@"pubDate"]) 
{ 
    self.currentAttribute = [NSMutableString string]; 
} 
else if(![elementName compare:@"category"]) 
{ 
    self.currentAttribute = [NSMutableString string]; 
} 

else if(![elementName compare:@"description"]) 
{ 
    self.currentAttribute = [NSMutableString string]; 
}} 

我正在泄漏每個

self.currentAttribute = [NSMutableString string]; 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{NSString *strAppend = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
if ([strAppend length] > 0) { 
    [self.currentAttribute appendString:string]; 
} 

}

任何幫助表示讚賞。提前

感謝

回答

0

非常感謝,但我沒有調用我的對象類中的dealloc函數。添加此函數並釋放所有使用[self.mystring釋放]的字符串解決了問題

1

如果你的屬性被保留,這樣的:

@property (nonatomic, retain) NSXMLParser * parser; 

......然後他們要保留的兩倍。所以一個版本不會這樣做。 你可以讓他們開這樣的:

NSXMLParser *tempParser = [[NSXMLParser alloc] initWithData:xml]; 
self.parser = tempParser; 
[tempParser release]; 

然後做任何你需要self.parser。 然後在你的dealloc方法中,你釋放它。由於這種方式是剩下1的保留計數(原ALLOC保持具有已發佈了tempParser),一個版本應該這樣做:

- (void) dealloc { 
[parser release]; 
[super dealloc]; 
} 

而且,我很困惑,爲什麼你會去的麻煩如果每個可能性具有相同的結果,則編寫if-else語句。