libxml2.2.dylib создает много утечек памяти - PullRequest
3 голосов
/ 12 марта 2012

Мне действительно трудно удалить / избежать утечек при реализации использования XpathQuery в моем проекте. В настоящее время я использую libXml2.2.dylib для анализа. Когда я проверяю утечки памяти, используя инструментов я обнаружил много утечек в рамках. libXml2.2.dylib leaks list

Каково было бы решение, чтобы избежать этих утечек. Память больше беспокоит нас, может ли кто-нибудь подсказать мне исправить / избежать этих глючных утечек. Спасибо заранее.

Ответы [ 3 ]

3 голосов
/ 13 марта 2012

Во-первых, если память представляет собой серьезную проблему, использование XML в любом случае не является вашим лучшим решением.JSON или двоичный формат намного эффективнее используют память.

Во-вторых, ваша трассировка не показывает утечек в платформе.То, что показывает, - это утечка объектов, чья память была выделена фреймворком.Более вероятно, что фактическая утечка происходит в вашем коде, обычно путем выделения объекта из библиотеки, но затем не освобождения (или освобождения в этом случае) объекта.Посмотрите на следы стека.

2 голосов
/ 09 июня 2012

Я решил проблему. У меня были утечки, когда в моих документах были пустые теги, я четко наблюдал и изменил некоторый код, вот и все. В основном я исправил в своем XpathQuery.m.используя тот же класс, вы можете использовать этот метод абсолютно без сомнений / мыслей об утечке памяти.Удачи.

0 голосов
/ 29 мая 2016

если вы используете TFHpple, вам нужно добавить следующий код в

DictionaryForNode

метод

Класс XPathQuery

if (XML_ELEMENT_NODE != currentNode->type) {
    return nil;
}

Итак, ваш последний метод должен выглядеть как

NSDictionary *DictionaryForNode(xmlNodePtr currentNode, NSMutableDictionary *parentResult,BOOL parentContent)
{
NSMutableDictionary *resultForNode = [NSMutableDictionary dictionary];
if (currentNode->name) {
    NSString *currentNodeContent = [NSString stringWithCString:(const char *)currentNode->name
                                                      encoding:NSUTF8StringEncoding];
    resultForNode[@"nodeName"] = currentNodeContent;
}

if (XML_ELEMENT_NODE != currentNode->type) {
    return nil;
}

xmlChar *nodeContent = xmlNodeGetContent(currentNode);

if (nodeContent != NULL) {
    NSString *currentNodeContent = [NSString stringWithCString:(const char *)nodeContent
                                                      encoding:NSUTF8StringEncoding];
    if ([resultForNode[@"nodeName"] isEqual:@"text"] && parentResult) {
        if (parentContent) {
            NSCharacterSet *charactersToTrim = [NSCharacterSet whitespaceAndNewlineCharacterSet];
            parentResult[@"nodeContent"] = [currentNodeContent stringByTrimmingCharactersInSet:charactersToTrim];
            xmlFree(nodeContent);
            return nil;
        }
        if (currentNodeContent != nil) {
            resultForNode[@"nodeContent"] = currentNodeContent;
        }
        return resultForNode;
    } else {
        resultForNode[@"nodeContent"] = currentNodeContent;
    }
    xmlFree(nodeContent);
}

xmlAttr *attribute = currentNode->properties;
if (attribute) {
    NSMutableArray *attributeArray = [NSMutableArray array];
    while (attribute) {
        NSMutableDictionary *attributeDictionary = [NSMutableDictionary dictionary];
        NSString *attributeName = [NSString stringWithCString:(const char *)attribute->name
                                                   encoding:NSUTF8StringEncoding];
        if (attributeName) {
            attributeDictionary[@"attributeName"] = attributeName;
        }

        if (attribute->children) {
            NSDictionary *childDictionary = DictionaryForNode(attribute->children, attributeDictionary, true);
            if (childDictionary) {
                attributeDictionary[@"attributeContent"] = childDictionary;
            }
        }

        if ([attributeDictionary count] > 0) {
            [attributeArray addObject:attributeDictionary];
        }
        attribute = attribute->next;
    }

    if ([attributeArray count] > 0) {
        resultForNode[@"nodeAttributeArray"] = attributeArray;
    }
}

xmlNodePtr childNode = currentNode->children;
if (childNode) {
    NSMutableArray *childContentArray = [NSMutableArray array];
    while (childNode) {
        NSDictionary *childDictionary = DictionaryForNode(childNode, resultForNode,false);
        if (childDictionary) {
            [childContentArray addObject:childDictionary];
        }
        childNode = childNode->next;
    }
    if ([childContentArray count] > 0) {
        resultForNode[@"nodeChildArray"] = childContentArray;
    }
}

xmlBufferPtr buffer = xmlBufferCreate();
xmlNodeDump(buffer, currentNode->doc, currentNode, 0, 0);
NSString *rawContent = [NSString stringWithCString:(const char *)buffer->content encoding:NSUTF8StringEncoding];
if (rawContent != nil) {
    resultForNode[@"raw"] = rawContent;
}
xmlBufferFree(buffer);
return resultForNode;
}
...