[英]Why is my code leaking?
UPDATE2我想我找到了漏洞的真正來源。 我有一些業務對象具有我忘記發布的字符串屬性。 這些字符串屬性是從我在這里創建的自定義xlm節點對象復制的(KGYXMLNode)我不明白為什么在這里報告泄漏而不是我的自定義類。 我的NSString屬性是copy
而不是retain
。
更新:我認為這是儀器或其他東西的一個錯誤,或者它不再神奇地泄漏,但是因為xcode 4它沒有顯示這個泄漏。
您好,根據儀器我在以下代碼中有泄漏。 我已經圍繞某些libxml函數構建了一個objective-c包裝器,以便能夠使用xpath解析xml文檔,並且在這個方法中我正在為我的自定義節點對象設置innerText。
-(void) SetInnerTextForNode: (xmlNodePtr) node : (KGYXMLNode *) obcNode
{
if ((node) && (node->children))
{
for (xmlNodePtr pnode = node->children; pnode != NULL; pnode = pnode->next)
{
if (pnode->type == XML_TEXT_NODE)
{
xmlChar *content = pnode->content;
NSString *innerText = [[NSString alloc] initWithUTF8String: (char *)content];
NSString *trimmedText = [innerText stringByTrimmingCharactersInSet: trimCharSet];
if (trimmedText.length > 0)
obcNode.innerText = trimmedText;
[innerText release];
break;
}
}
}
}
泄漏是NSString *innerText = [[NSString alloc] initWithUTF8String: (char *)content];
。 我不知道出了什么問題。
您不應該直接訪問節點的內容,而是使用xmlNodeGetContent :
xmlChar *content = xmlNodeGetContent(pnode);
NSString *innerText = [[NSString alloc] initWithUTF8String: (char *)content];
NSString *trimmedText = [innerText stringByTrimmingCharactersInSet: trimCharSet];
if (trimmedText.length > 0)
obcNode.innerText = trimmedText;
[innerText release];
// you must free what xmlNodeGetContent returns!
xmlFree(content);
break;
我不知道為什么你的代碼泄漏了,但在我看來,你有一個不安全的自動釋放對象分配給obcNode.innerText而不保留它。
這是一個猜測,但我認為你的obcnode dealloc方法不會在deallocation上釋放它的innerText實例變量。 乍一看,您的代碼片段看起來很適合內存管理,這是我能看到的唯一潛在錯誤。
它會標記innerText的泄漏的原因可能是trimmedText使用與innerText相同的底層unichar數組但具有不同的start和length值,因此它保留innerText以阻止unichar數組消失。
因為trimmedText是一個不可變的字符串,所以向它發送副本只會導致它向自身發送retain並返回它自己,所以obcNode擁有擁有innerText的trimmedText。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.