2011-04-04 97 views
1

我正在編寫我自己的包裝類來解析XML數據。通常我會使用泄漏性能工具通過忘記釋放分配的內存來檢測懷疑行爲。 此時我發現下面的代碼(第一行被工具標記)給我帶來了巨大的內存泄漏(XML數據文件變得越大泄漏越多)。 以下部分用於接收節點內的文本。爲什麼我使用xmlTextReaderConstValue獲取內存泄漏?

NSString *currentTagValue = [NSString stringWithCString:(char *)xmlTextReaderConstValue(XMLReader) encoding:NSUTF8StringEncoding]; 
SEL selector = NSSelectorFromString([NSString stringWithFormat:@"set%@:", [currentTag capitalizedString]]); 
[currentItem performSelector:selector withObject:currentTagValue]; 

如果我添加

[currentTagValue release] 

內存泄漏都不見了。

這對我來說似乎很奇怪,因爲我沒有手動爲NSString分配內存。這就是爲什麼我認爲它會被自動釋放。 如果我將上面的代碼示例與負責獲取節點名稱的部分進行比較,則整個情況會變得很奇怪。

NSString *currentTagName = [NSString stringWithCString:(char *)xmlTextReaderConstName(XMLReader) encoding:NSUTF8StringEncoding]; 
SEL selector = NSSelectorFromString([NSString stringWithFormat:@"set%@:", [currentTagName capitalizedString]]); 

在這裏我不必添加手動釋放,一切工作正常,我得到沒有內存泄漏。 我不確定我描述的問題是否是xml ... ConstValue函數(工作部分使用xml ... ConstName)的副作用,或者之後的原因是執行選擇器。

感謝您的閱讀,希望任何人都可以向我解釋。

回答

2

您使用的是libxml2嗎?我沒有使用libxml2的,但是我很快用Google搜索,發現這個: http://xmlsoft.org/html/libxml-xmlreader.html

功能:xmlTextReaderConstValue

返回:字符串或NULL,如果沒有可用的 。 結果將是 解除分配在下一個閱讀() 操作

相比之下,與xmlTextReaderConstName

功能:xmlTextReaderConstName

返回:本地名稱或NULL,如果沒有可用的 ,字符串被釋放 與讀者

它可能是lib中的泄漏,或者由於結果似乎是延遲發佈(或者完全不同,因爲我沒有第一手的經驗)。程序是否因泄漏而崩潰?如果不是,那可能只是虛驚一場。

希望它有幫助。

+0

我確定這是重點。該應用程序不會因此泄漏而崩潰。感謝您的文檔鏈接。 – TRD 2011-04-05 07:26:33

+0

不客氣。很高興我幫了忙。 :) – Altealice 2011-04-05 07:38:03