NSXMLParser Asynch -Как правильно выпустить? - PullRequest
0 голосов
/ 18 сентября 2011

OK. Я использую 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 сообщает мне, что синтаксический анализатор протекает. Парсеры плохо протекают, потому что они упаковывают много багажа.

Как еще мне разобраться с асычными парсерами? Я сильно подозреваю, что мне просто нужно направить на «М», чтобы я мог «RTFM».

Спасибо!

1 Ответ

2 голосов
/ 18 сентября 2011
myParser = [[[BMLT_Parser alloc] initWithContentsOfURL:[NSURL URLWithString:uri]] retain];

В приведенном выше коде вы сначала выделяете память для myParser с помощью alloc, а затем снова сохраняете. Вот, что вы делаете неправильно, поскольку вы должны сохранять только тогда, когда у вас есть право собственности на объект. Но через 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];
        }
    }
...