我正在使用以下函数将我的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(它似乎为空)。
我可以避免泄漏将这个放在我的dealloc方法上:
for (CXMLNode *node in content) {
[node release];
}
但我觉得我做错了什么......或者至少我不知道发生了什么......请你能给我一些线索吗?
谢谢!
答案 0 :(得分:6)
copy
创建一个保留计数为1的对象,-addObject:
添加一个额外的保留,因此您必须在将其添加到数组后释放eventNode
或自动释放副本:
[content addObject:[[eventNode copy] autorelease]];
答案 1 :(得分:2)
你应该使用
CXMLNode *tempEventNode = [eventNode copy];
[content addObject:tempEventNode];
[tempEvent release];
而不是[content addObject:[eventNode copy]];
当您使用[eventNode copy]
时,它会生成r etaincount +1
,当您直接添加此副本时(如在代码中),您将再次增加+1,因为数组将保留它。所以对于数组保留它不是你的释放的责任,但是对于你的复制调用你必须释放它。
[eventNode copy] --> retain count +1
[content addObject:[eventNode copy]]; -> retaincount +2
谢谢