2012-09-07 61 views
0

我從Internet加載數據,並在另一個線程中使用DDXML解析器解析它。這裏是代碼(回調connectionDidFinishLoading:在後臺線程來了,我定的URLConnection在後臺線程):DDXML解析器中的內存泄漏

- (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。爲什麼這些對象不被清除?也許,我錯誤地使用autorelease池或DDXML解析器是驚喜?

+0

在您釋放xdoc之後,嘗試釋放'nodes'並查看是否會發生崩潰。如果沒有,那麼DDXML可能會返回一個非自動釋放數組(一個給定方法名稱的錯誤肯定會返回它)。如果這是真的,那麼可能是陣列中的每個項目也不是自動發佈的。 –

+0

看起來這是自動回收中的問題。有趣的是,當我將Internet連接從後臺移動到前臺線程並僅保留在後臺解析時,autorelease池就可以工作。 – QuickNick

回答

2

retainCount沒用。別叫它。 http://whentouseretaincount.com/

不需要同時有drainrelease池;只是drain而已。

更好的是,在池的範圍內使用@autoreleasepool {...}

由於您使用的是Allocations樂器,請打開「曲目引用計數」。然後,您可以查看保留/釋放對象的歷史記錄,並瞭解爲什麼他們仍然在附近。

+0

感謝您的回答:)我解決了這個問題,但我還沒有理解如何。有一個很大的研究領域。 – QuickNick