为什么我的代码会泄漏?

gyo*_*dor 3 iphone memory-leaks objective-c libxml2 instruments

UPDATE2我想我找到了泄漏的真正来源。我有一些业务对象具有我忘记发布的字符串属性。这些字符串属性是从我的自定义 xlm 节点对象复制而来的,在此处创建 (KGYXMLNode) 我不明白为什么在这里报告泄漏而不是我的自定义类。我的 NSString 属性是copy和不是retain.

更新:我认为这是 Instruments 中的错误或其他东西,或者它不再神奇地泄漏,但是由于 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;
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

泄漏是NSString *innerText = [[NSString alloc] initWithUTF8String: (char *)content];。我不知道出了什么问题。

小智 5

您不应直接访问节点的内容,而应使用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;
Run Code Online (Sandbox Code Playgroud)