行。我正在使用NSXMLParser:
myParser = [[[BMLT_Parser alloc] initWithContentsOfURL:[NSURL URLWithString:uri]] retain];
[myParser setDelegate:self];
[myParser performSelectorInBackground:@selector(parse) withObject:nil];
我有自己的子类,以便做一些内存池和一些实例数据。基本上,可以将BMLT_Parser视为与NSXMLParser相同。
请注意,我是异步调用它,所以在同步调用之后没有简单的释放。
我所做的是声明以下委托功能:
- (void)parserDidEndDocument:(NSXMLParser *)parser ///< The parser in question
{
[myParser release];
myParser = nil;
}
myParser是解析器的实例变量。基本上,回调中的myParser ==解析器。
现在,问题是Instruments告诉我解析器正在泄漏。解析器泄漏严重,因为他们收拾了很多行李。
我应该如何解析asych解析器?我强烈怀疑我只需要被指向“M”,这样我就可以“RTFM”。
谢谢!
答案 0 :(得分:2)
myParser = [[[BMLT_Parser alloc] initWithContentsOfURL:[NSURL URLWithString:uri]] retain];
在上面的代码中,你首先通过alloc为myParser分配内存,并再次保留.Here,你做错了,因为你只有当你拥有一个对象的所有权时才应该保留。但是通过alloc你将得到所有权对象 “myParser”。 当你使用了这个对象时,你需要释放它。 你应该做点什么......
myParser = [[BMLT_Parser alloc] initWithContentsOfURL:[NSURL URLWithString:uri]];
[myParser setDelegate:self];
[myParser performSelectorInBackground:@selector(parse) withObject:nil];
[myParser release];
同样,在委托定义中,你首先释放对象,然后将其设置为nil。这是没有意义的,好像你没有任何对象的内存,我们如何设置任何值。写这样的东西..
- (void)parserDidEndDocument:(NSXMLParser *)parser ///< The parser in question
{
if(_myParser)
{
[_myParser release];
}
}