【问题标题】:NSMutableString memory leakNSMutableString 内存泄漏
【发布时间】:2011-08-29 12:43:50
【问题描述】:

我在代码中的仪器中遇到内存泄漏

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

}

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

【问题讨论】:

  • 代理是否保留res
  • @Tudorizer .There 没有保留我正在使用分配属性(@property(assign) id 委托)
  • @Rams: 属性是否保留getcat: 中的资源?您只回答委托属性,这不是问题。
  • @Rudy Velthuis No.. 我也会发布 getcat 方法
  • @Rudy Velthuis 检查我编辑的问题

标签: iphone objective-c nsmutablestring


【解决方案1】:

与其设置一个自动释放池,它实际上会释放字符串,不如你自己释放它?如果委托保留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: 中这样做。

但这并不能解释许多泄露的字符串。

【讨论】:

  • ...当我经常访问 nsurlconnection 时。我的字符串有泄漏
  • 泄漏不是由上面的代码引起的,这样使用的自动释放池也没有任何好处。
  • 你可以在任何地方添加NSLog(@"initialized %p", res);NSLog(@"released %p", res);调用,看看retains和releases是否匹配(%p给出地址)。
  • @Rudy Velthuis (initialized 0xd32a1c0,released 0xd32a1c0) 如何识别泄漏。
  • @Rams:如果你只得到一次,你似乎没有泄漏。将此类日志调用放在您初始化或释放字符串的任何地方。我以为你经常调用这个例程?如果是这样,您应该会收到很多日志消息。还可以将 allocs 工具与泄漏工具一起使用,看看什么被分配到了哪里。
【解决方案2】:

我解决了这个问题

泄漏在

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

    currentElement = [elementName copy];--->总是在这一行泄漏,但泄漏仪器显示该行

}

将代码替换为 self.currentElemnt=elementName

【讨论】:

    猜你喜欢
    • 2011-01-04
    • 1970-01-01
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    相关资源
    最近更新 更多