2011-02-23 69 views
2

更新:當泄漏儀器指向第一個呼叫[parser parse];時,我發現泄漏只發生在我第二次打這個呼叫時。我沒有在NSXMLParser類的引用或文檔中看到任何表示無法重新解析的內容。我錯過了什麼嗎?我是否應該每次創建一個新的NSXMLParser來解析文檔?NSXMLParser第二個解析呼叫的內存泄漏

我目前正在嘗試追查我的XML解析代碼爲iPhone應用程序泄漏。我已經通過其他關於NSXMLParser漏洞的帖子進行了搜索,但沒有找到任何可以使用的答案,所以我非常感謝幫助。

文書泄漏工具在下面的代碼檢測泄漏:

NSData* data = [NSData dataWithContentsOfFile: [[NSBundle mainBundle] pathForResource: @"collisionGraph" ofType: @"graphml"]]; 
NSXMLParser* parser = [[[NSXMLParser alloc] initWithData: data] autorelease]; 
[parser setDelegate:self]; 
[parser parse]; <<<<< leak here according to Leaks 
self.currentPass++; 

... 

[parser parse]; 
self.currentPass++; 

我刪除了所有的代碼從我委託回調方法,但這並沒有阻止泄漏。

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
namespaceURI:(NSString *)namespaceURI 
qualifiedName:(NSString *)qualifiedName 
    attributes:(NSDictionary *)attributeDict 
{ 
} 

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 
} 

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
namespaceURI:(NSString *)namespaceURI 
qualifiedName:(NSString *)qName 
{ 
} 

這裏是儀器http://i22.photobucket.com/albums/b311/Erithil/ParserLeak.png(聯繫的,因爲我沒有代表張貼圖片)的觀點。

我真的被這個難住,所以任何建議表示讚賞。提前致謝。

+0

你在哪裏調用你的NSXMLParser對象的版本?你可以使用調試器或日誌聲明來驗證你的代碼調用版本是否實際上正在運行? - [NSXMLParser parse]可能會分配內存,當解析器被釋放時,它期望清理內存。 – Ryan 2011-02-23 21:58:46

+0

@Ryan謝謝瑞恩。我的一位同事還建議解析器可能會泄漏,因爲autorelease池可能無法及時釋放。我測試了用'[parser release]'來調用'autorelease'調用;''在方法結束時。使用調試器,我確認發佈的調用正在進行。儘管如此,泄漏仍然存在。 – Dan 2011-02-23 22:43:24

回答

1

它可能是NSXMLParser內的泄漏(如果xmlCleanupParser()未在基礎libxml上調用)或可重用內存被錯誤標記爲泄漏。我認爲解析器通常會發生這種情況,因爲它們會重用(而不是正確釋放?)它們分配的內存。

+0

我明白了。有沒有辦法確定泄漏是否是真實的(並且如果不告訴泄漏忽略它),還是應該通過使用單獨的NSXMLParser對象來解決此問題?謝謝。 – Dan 2011-02-24 04:49:21

+0

我認爲使用解決方法是您的最佳選擇。 – 2011-02-24 08:01:04

+0

我不認爲NSXMLParser有任何規定被要求兩次解析文檔。期望是你會創建,解析,然後銷燬。 – Ryan 2011-02-24 19:31:16