繁体   English   中英

自动释放池和内存管理

[英]Autorelease pool and memory management

我正在使用以下函数将我的XML的每个“facility”节点放在NSMutable数组中:

-(void) grabXML {

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    CXMLDocument *doc = [[[CXMLDocument alloc] initWithData:data options:0 error:nil] autorelease];

    NSArray *nodes = [[doc rootElement] nodesForXPath:@"//facilities" error:nil];

    for (CXMLNode *itemNode in nodes)
    {               
        for (CXMLNode *eventNode in [itemNode children])
        {           
            if ([[eventNode name] isEqualToString:@"facility"]) {

                [content addObject:[eventNode copy]];               

            }

        }
    }

    loading = FALSE; 
    [table reloadData];

    [pool release];

}

请注意,池是必需的,因为我在一个单独的线程中调用了grabXML方法。

使用仪器我可以看到以下行产生泄漏

[content addObject:[eventNode copy]];

如果我改变它

[content addObject:eventNode];

我以后无法访问XCMLNode(似乎是null)。

我可以避免泄漏把它放在我的dealloc方法上:

for (CXMLNode *node in content) {
    [node release];
}

但我觉得我做错了......或者至少我不知道发生了什么......请你能给我一个线索吗?

谢谢!

copy创建一个保留计数为1的对象, -addObject:添加一个额外的保留,因此您必须在将eventNode添加到数组后释放它或自动释放副本:

[content addObject:[[eventNode copy] autorelease]];

你应该用

CXMLNode *tempEventNode =  [eventNode copy];
  [content addObject:tempEventNode];   
  [tempEvent release];

代替, [content addObject:[eventNode copy]];

当您使用[eventNode copy]它会使得etaincount +1 ,当您直接添加此副本时(如在您的代码中),您将再次增加+1,因为数组将保留它。 所以对于数组保留它不是你的释放的责任,但对于你的复制调用你必须释放它。

[eventNode copy] --> retain count +1
[content addObject:[eventNode copy]]; -> retaincount +2

谢谢

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM