Утечка NSCFString appendString при разборе xml - PullRequest
2 голосов
/ 05 марта 2011

У меня проблемы с удалением утечек из приложения для iPhone, над которым я работаю.Я анализирую XML-канал для получения данных.Вот код, который я использую для анализа

[[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];

и на1010 *

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

}

Любая помощь приветствуется.Заранее спасибо

Ответы [ 2 ]

1 голос
/ 05 марта 2011

Если ваши свойства сохраняются, например:

@property (nonatomic, retain) NSXMLParser * parser;

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

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

Затем выполните все, что вам нужно, с помощью self.parser.Затем в вашем методе dealloc вы отпускаете его.Так как таким образом оставляется с счетом сохранения 1 (исходный ресурс выделения был выпущен с помощью tempParser), один релиз должен сделать это:

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

Кроме того, я озадачен, почему вы переходите кпроблема написания операторов if-else, если каждая возможность имеет одинаковый результат.

0 голосов
/ 08 июля 2011

Большое спасибо, но я не вызывал функцию dealloc внутри моего класса объектов. Добавление этой функции и освобождение всех строк с помощью [self.mystring release] решило проблему

...