簡體   English   中英

為什么我的代碼泄露了?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM