Утечка памяти в парсере DDXML

Я загружаю данные из Интернета и анализирую их с помощью анализатора DDXML в другом потоке. Вот код (обратный вызов connectionDidFinishLoading: идет в фоновом потоке, я запланировал URLConnection в фоновом потоке):

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSLog(@"connection did finish load");
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    DDXMLDocument *xdoc = [[DDXMLDocument alloc] initWithData: receivedXmlData options:0 error: NULL];
    NSLog(@"document retainCount1 = %d", [xdoc retainCount]);
    NSArray *nodes = [xdoc selectNodes: @"./items/item"];
    NSLog(@"document retainCount2 = %d", [xdoc retainCount]);
    for (DDXMLElement *tabXmlItem in nodes)
    {
        // here is the parsing
    }
    NSLog(@"document retainCount3 = %d", [xdoc retainCount]);
    [xdoc release];
    [receivedXmlData setLength:0];
    [pool drain];
    [pool release];
}

Я вижу в распределителе памяти: DDXMLDocuments, DDXMLNodes, DDXMLElements, все еще живые после окончания синтаксического анализа. Итак, в памяти большое количество CFString и CFData. Почему эти объекты не очищаются? Может быть, я использую пул авто-релиза неправильно или парсер DDXML удивлен?

1 ответ

Решение

retainCount бесполезно. Не называй это. http://whentouseretaincount.com/

Нет необходимости обоим drain а также release бассейн; просто drain Это.

Еще лучше, используйте @autoreleasepool {...} вокруг объема бассейна.

Поскольку вы используете инструмент "Распределение", включите "Отслеживание ссылок". Затем вы можете посмотреть историю удержаний / выпусков на объектах, которые торчат вокруг, и понять, почему они все еще существуют.

Другие вопросы по тегам