Странный сбой, если я пытаюсь выпустить CXMLDocument - PullRequest
0 голосов
/ 17 июля 2011

Я анализирую некоторый XML с помощью TouchXML и получаю сбой -EXC_BAD_ACCESS.Метод проб и ошибок я обнаружил, что если я не выпущу свой CXMLDocument (который я выделяю), то все будет хорошо.Вот мой код:

- (NSArray *)getLookUps {

    //Do some stuff and then...

    NSData *tempData = [NSURLConnection sendSynchronousRequest:request 
                                                 returningResponse:nil 
                                                             error:nil];



        CXMLDocument *xmlDoc = [[CXMLDocument alloc] initWithData:tempData options:0 error:nil];
        NSDictionary *mappings = [NSDictionary dictionaryWithObject:@"http://****/****" 
                                                             forKey:@"****"];

        NSLog(@"%@", [[NSString alloc] initWithData:tempData encoding:NSUTF8StringEncoding]);
        NSArray *orders = [[xmlDoc rootElement] nodesForXPath:@"//****:Unit" 
                                            namespaceMappings:mappings 
                                                        error:nil];

        NSMutableArray *units = [NSMutableArray arrayWithCapacity:200];

        for (CXMLElement *order in orders) {
            NSArray *nodes = [order children];
            NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithCapacity:[nodes count]];

            for (CXMLElement *node in nodes) {
                [dictionary setObject:[node stringValue] forKey:[node name]];
            }
            [units addObject:dictionary];
        }

        //[xmlDoc release];
    return units;
}

См. На 2-й последней строке, [xmlDoc release].Я прокомментировал это, потому что это терпит крах, если я не делаю.Что я делаю неправильно?Спасибо.

Ответы [ 4 ]

1 голос
/ 25 октября 2011

Эта ошибка была зарегистрирована и помечена как исправленная в более новых версиях библиотеки.

http://code.google.com/p/touchcode/issues/detail?id=35

Я не проверял, действительно ли она исправлена, комментарийпо этому адресу можно предположить, что это не так.

На мой взгляд, этой библиотеки следует вообще избегать.Для приложений iOS используйте libxml2 по нескольким причинам:

  • Он протестирован и опробован, насквозь
  • Это быстро и эффективно
  • Построение представления вашего узла на основе узловXML может облегчить кодирование, но он тратит впустую память, поскольку у вас всегда есть весь документ в памяти.Вы, вероятно, имеете это более одного раза при разборе.Вместо этого вы должны разработать свой код для работы с подходом libxml2.Вы согласитесь, когда начнете анализировать документы большого размера.
1 голос
/ 17 июля 2011

Вам, вероятно, нужно сохранить объект словаря, иначе он также будет освобожден, когда вы отпустите анализатор.Попробуйте изменить [units addObject:dictionary]; на [units addObject:[dictionary retain]];.

Еще одна идея - установить указатель xmlDoc на автоматический выпуск:

CXMLDocument *xmlDoc = [[[CXMLDocument alloc] initWithData:tempData options:0 error:nil] autorelease];
0 голосов
/ 16 июня 2015

Я заметил, что в TouchXML Class "CXMLDocument" мы имеем следующую обработку в методе "dealloc".

- (void)dealloc
{
    // Fix for #35 http://code.google.com/p/touchcode/issues/detail?id=35 -- clear up the node objects first (inside a pool so I _know_ they're cleared) and then freeing the document

    @autoreleasepool {

        nodePool = NULL;

    }
    //
    xmlUnlinkNode(_node);
    xmlFreeDoc((xmlDocPtr)_node);
    _node = NULL;
}

Я не уверен, почему мы используем "autoreleasepool" в "dealloc". Это стандартное кодирование? Поправь меня, если я ошибаюсь.

0 голосов
/ 24 сентября 2013

Я использовал TouchXML довольно часто, и (к счастью?) У меня до сих пор не было этой проблемы, но это только случилось ...

Я разместил решение здесь: Сбой памяти при использовании [CXMLNode nodeForXPath] с сопоставлениями пространства имен

...