更新:當泄漏儀器指向第一個呼叫[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(聯繫的,因爲我沒有代表張貼圖片)的觀點。
我真的被這個難住,所以任何建議表示讚賞。提前致謝。
你在哪裏調用你的NSXMLParser對象的版本?你可以使用調試器或日誌聲明來驗證你的代碼調用版本是否實際上正在運行? - [NSXMLParser parse]可能會分配內存,當解析器被釋放時,它期望清理內存。 – Ryan 2011-02-23 21:58:46
@Ryan謝謝瑞恩。我的一位同事還建議解析器可能會泄漏,因爲autorelease池可能無法及時釋放。我測試了用'[parser release]'來調用'autorelease'調用;''在方法結束時。使用調試器,我確認發佈的調用正在進行。儘管如此,泄漏仍然存在。 – Dan 2011-02-23 22:43:24