Утечка памяти в NSMutableString - PullRequest
       18

Утечка памяти в NSMutableString

1 голос
/ 29 августа 2011

Я получаю утечку памяти в приборах с кодом enter image description here

-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
       NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

     NSMutableString * res = [[[NSMutableString alloc] initWithBytes: [webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding]autorelease];
     [webData release];
    [connection release];
        [res replaceOccurrencesOfString:@"&" withString:@"&" options:NSCaseInsensitiveSearch range:(NSRange){0,[res length]}];
    [delegate getcat:res];

    [pool drain];
}



- (void)getcat:(NSString*)xml
{

if (xmlParser) {

    [xmlParser release];
}
Cid = [[NSMutableArray alloc] init];
Categories = [[NSMutableArray alloc] init];

NSData *data = [xml dataUsingEncoding:NSUTF8StringEncoding];
xmlParser = [[NSXMLParser alloc] initWithData:data];

[xmlParser setDelegate:self];

[xmlParser setShouldResolveExternalEntities:YES];
[xmlParser parse];
[xmlParser release];

}

Это правильный способ управления памятью?

Ответы [ 2 ]

1 голос
/ 29 августа 2011

Вместо того, чтобы настраивать пул автоматического выпуска, который на самом деле освобождает строку, почему бы вам просто не освободить ее самостоятельно? Если делегат сохраняет строку в getcat:, вы можете просто освободить ее:

- (void) connectionDidFinishLoading: (NSURLConnection *) connection
{
    // Omit the autorelease pool.

    NSMutableString * res = [[NSMutableString alloc] initWithBytes: [webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding];
    [webData release];
    [connection release];
    [res replaceOccurrencesOfString:@"&" withString:@"&" options:NSCaseInsensitiveSearch range:NSMakeRange(0, res.length)];
    [delegate getcat:res];
    [res release];
}

Взглянув на getcat:, я вижу проблему:

[xmlParser parse];
[xmlParser release];

Обычно объектам нужен делегат для возврата результатов из потока. Я предполагаю, что [xmlParser parse] запускает поток. Вы, вероятно, не должны выпускать его до его завершения, то есть вы делаете это в parserDidEndDocument:.

Это, однако, не объясняет многие утечки строк.

0 голосов
/ 05 сентября 2011

Я исправил эту проблему

Утечка в

  • (void) анализатор: (NSXMLParser *) синтаксический анализатор didStartElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualName: (NSString *) qName attribute: (NSDictionary *) attributeDict {

    currentElement = [elementName copy]; ---> Всегда протекает в этой строке, но прибор для обнаружения утечек показывает эту строку

}

заменить код на self.currentElemnt = elementName

...