Утечка памяти в парсере 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 {...}
вокруг объема бассейна.
Поскольку вы используете инструмент "Распределение", включите "Отслеживание ссылок". Затем вы можете посмотреть историю удержаний / выпусков на объектах, которые торчат вокруг, и понять, почему они все еще существуют.