2010-11-08 2 views
2

UPDATE2 Я думаю, что нашел истинный источник утечек. У меня были некоторые бизнес-объекты, у которых есть свойства строки, которые я забыл выпустить. Эти свойства строки были скопированы из моего настраиваемого объекта узла xlm, созданного здесь (KGYXMLNode). Я не понимаю, почему здесь сообщается об утечке вместо моего пользовательского класса. Мои свойства NSString были copy, а не retain.Почему мой код протекает?

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

Здравствуйте, согласно приборам у меня есть утечка в следующем коде. Я построил обертку object-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];. Я не знаю, что не так.

ответ

4

Вы не должны получить доступ к содержимому узла-напрямую, вместо этого использовать 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

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

+2

Что заставляет вас сказать, что? Откуда вы знаете, является ли свойство 'innerText'' assign', 'copy' или' keep'? – 2010-11-08 14:21:41

+2

obcNode.innerText - свойство копирования. Это должно быть хорошо. –

2

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

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

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

+0

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

+0

Я думал, что '[innerText stringByTrimmingCharactersInSet]' возвращает совершенно новую строку. Im думает, что в моем случае есть 3 разных строки в памяти, создается исходное 'xmlChar * content', а затем' NSString * innerText', а затем 'NSString * trimmedText'. Оба независимы друг от друга. И единственный объект, который должен иметь для меня значение, - это внутренний текст, потому что он не автореализован. И я думаю, что мне не нужно выпускать 'xmlChar * content', но, возможно, я ошибаюсь. –

+0

Существует три строки, но, возможно, не три основных массива unichar. – JeremyP

Смежные вопросы