1

我在代码中的仪器中出现内存泄漏在此处输入图像描述

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

}

这是管理内存的正确方法吗?

4

2 回答 2

1

与其设置一个实际释放字符串的自动释放池,不如自己释放它?如果委托保留字符串 in 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:.

然而,这并不能解释许多泄露的字符串。

于 2011-08-29T13:13:29.333 回答
0

我解决了这个问题

泄漏在

  • (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURIqualifiedName:(NSString *)qName 属性:(NSDictionary *)attributeDict{

    currentElement = [元素名称副本]; --->总是在这条线漏水 但是漏水仪显示那条线

}

用self.currentElemnt=elementName替换代码

于 2011-09-05T09:08:26.010 回答