Утечки памяти при использовании NSXMLParser - PullRequest
0 голосов
/ 02 декабря 2011

У меня возникли трудности с утечкой памяти в следующем коде.

Использование инструмента утечек в XCode, который показывает утечки памяти в моем коде, который используется для разбора rss.

Я использую XCode 4 и освобождаю выделения в нижней части кода. Я попытался добавить релизы в каждый локальный раздел, что приводит к сбоям или прекращению работы программы.

Любая помощь совета высоко ценится!

Код, который вызывает утечки:

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
NSString * errorString = [NSString stringWithFormat:@"Unable to download story feed from web site (Error code %i )", [parseError code]];
UIAlertView * errorAlert = [[UIAlertView alloc] initWithTitle:@"Error loading content" message:errorString delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[errorAlert show];
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
currentElement = [elementName copy];
if ([elementName isEqualToString:@"item"]) {
item = [[NSMutableDictionary alloc] init];
currentImage = [[NSMutableString alloc] init];
currentTitle = [[NSMutableString alloc] init];
currentDate = [[NSMutableString alloc] init];
currentSummary = [[NSMutableString alloc] init];
currentLink = [[NSMutableString alloc] init];
}
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if ([elementName isEqualToString:@"item"]) {
[item setObject:currentImage forKey:@"media"];
[item setObject:currentTitle forKey:@"title"];
[item setObject:currentLink forKey:@"link"];
[item setObject:currentSummary forKey:@"summary"];
[item setObject:currentDate forKey:@"date"];
[stories addObject:[item copy]];
}
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if ([currentElement isEqualToString:@"media"]) {
[currentImage appendString:string];
} else if ([currentElement isEqualToString:@"title"]) {
[currentTitle appendString:string];
} else if ([currentElement isEqualToString:@"link"]) {
[currentLink appendString:string];
} else if ([currentElement isEqualToString:@"description"]) {
[currentSummary appendString:string];
} else if ([currentElement isEqualToString:@"pubDate"]) {
[currentDate appendString:string];
}
}

А позже выпуск:

- (void)dealloc {
[currentElement release];
[rssParser release];
[stories release];
[item release];
[currentImage release];
[currentTitle release];
[currentDate release];
[currentSummary release];
[currentLink release];
[super dealloc];
}

Ответы [ 2 ]

0 голосов
/ 02 декабря 2011

В начале каждого didStartElement: метода создаются новые экземпляры, но он освобождается только один раз, когда класс освобождается.Таким образом, если предъявить иск о том, что didStartElement: вызывается более одного раза, происходит сборка экземпляров строковых объектов.

Вероятно, вам нужно создать эти экземпляры один раз при создании экземпляра класса, а затемдобавить к ним элементы, которые встречаются.

В любом выпуске события для каждого выделения.

0 голосов
/ 02 декабря 2011

Изменить следующее:

UIAlertView * errorAlert = [[[UIAlertView alloc] initWithTitle:@"Error loading content" message:errorString delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil] autorelease];

Этот код должен быть выполнен только один раз:

item = [[NSMutableDictionary alloc] init];
currentImage = [[NSMutableString alloc] init];
currentTitle = [[NSMutableString alloc] init];
currentDate = [[NSMutableString alloc] init];
currentSummary = [[NSMutableString alloc] init];
currentLink = [[NSMutableString alloc] init];
...