Почему мой код протекает? - PullRequest
2 голосов
/ 08 ноября 2010

ОБНОВЛЕНИЕ2 Я думаю, что нашел истинный источник утечек.У меня были некоторые бизнес-объекты со строковыми свойствами, которые я забыл выпустить.Эти строковые свойства были скопированы из моего пользовательского объекта узла xlm, созданного здесь (KGYXMLNode). Я не понимаю, почему здесь сообщается об утечке вместо моего пользовательского класса.Мои свойства NSString были copy, а не retain.

ОБНОВЛЕНИЕ: Я думаю, что это была ошибка в Инструментах или что-то в этом роде, или она больше не магически протекает, но с xcode 4 это неt показать эту утечку.

Здравствуйте, согласно приборам, у меня есть утечка в следующем коде.Я построил оболочку target-c вокруг определенных функций libxml, чтобы иметь возможность анализировать документы xml с помощью xpath, и в этом методе я устанавливаю 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];.Я не знаю, что не так.

Ответы [ 3 ]

4 голосов
/ 23 апреля 2011

Вы не должны обращаться к содержимому узла напрямую, вместо этого используйте 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;
2 голосов
/ 08 ноября 2010

Это немного догадка, но я думаю, что ваш метод dealloc для obcnode не освобождает свою переменную экземпляра innerText при освобождении.На первый взгляд, ваш фрагмент кода выглядит хорошо для управления памятью, и это единственная потенциальная ошибка, которую я вижу.

Причина, по которой он будет отмечать утечку для innerText, возможно, заключается в том, что trimmedText использует тот же базовый массив unicharкак innerText, но с различными значениями начала и длины, и поэтому он сохраняет innerText, чтобы остановить удаление массива unichar.

Поскольку trimmedText является неизменяемой строкой, отправка копии на нее просто заставляет его отправлять retain себе и возвращать себя, поэтому obcNode владеет trimmedText, которому принадлежит innerText.

2 голосов
/ 08 ноября 2010

Я не знаю, почему ваш код протекает, но мне кажется, что вы небезопасно присваиваете автоматически выпущенный объект obcNode.innerText, не сохраняя его.

...