NSXMLParser Asynch - 我如何正确发布?

时间:2011-09-17 22:24:31

标签: iphone ios asynchronous nsxmlparser

行。我正在使用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”。

谢谢!

1 个答案:

答案 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];
        }
    }