EXC_BAD_ACCESS аварийно завершает работу при освобождении NSXMLParser

Я вижу прерывистый сбой при [выпуске парсера]. Я бы сказал, что вижу это примерно в 5% случаев, и данные, которые я анализирую, варьируются в зависимости от каждого сбоя. Я не могу на всю жизнь понять, почему.

Прежде чем я отправлю отчет об ошибке в Apple (который, к счастью, не будет воспроизведен в примере кода), кто-нибудь сталкивался с этим и знает, что может происходить?

    NSData *d = [data copy]; // data is typically 2K-13K bytes
    @synchronized (xmlParserLock) {
        [[NSURLCache sharedURLCache] setMemoryCapacity:0];
        [[NSURLCache sharedURLCache] setDiskCapacity:0];

        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
        NSXMLParser *parser = [[NSXMLParser alloc] initWithData:d];
        [parser setDelegate:self];
        [parser setShouldProcessNamespaces:NO];
        [parser setShouldReportNamespacePrefixes:NO];
        [parser setShouldResolveExternalEntities:NO];
        [parser parse];
        [parser release];
        [pool release];
    }
    [d release];

А вот вывод gdb 'where', который указывает на [parser release]:

#0  0x93d08d12 in xmlCharEncCloseFunc ()
#1  0x93cfc0e3 in xmlFreeParserInputBuffer ()
#2  0x93cfc08f in xmlFreeInputStream ()
#3  0x93cfbdac in xmlFreeParserCtxt ()
#4  0x961384d6 in -[NSXMLParser dealloc] ()
#5  0x00149de7 in -[MyParserClass parseResponse] (self=0x104e9f0, _cmd=0x1766dc) at /Users/mike/Documents/MyApp/Classes/MyParserClass.m:60

Заранее благодарю за любую помощь!

4 ответа

Решение

Я думаю, что я понял это - некоторый код в другом месте приложения использует функции XML, такие как:

xmlCtxtReadMemory()
xmlClearParserCtxt();
xmlFreeParserCtxt();
xmlCleanupParser();
xmlFreeDoc();

Эти функции, вероятно, выполняются в другом потоке, в то время как я выполняю фрагмент кода, который я разместил. NSXMLParser, очевидно, использует те же функции под капотом.

Я добавил синхронизированный блок в другой код, используя тот же объект блокировки, что и тот, который я использую для своего использования NSXMLParser, и сбои, похоже, исчезли. Таким образом, я думаю, урок здесь заключается в том, что эти функции XML абсолютно не поточнобезопасны - используйте с осторожностью!

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

Вы должны удалить свои данные только после завершения анализа. В методе делегата называется parserDidEndDocument: выпуск данных.

Надеюсь, это поможет.

Thierry

Вы должны удалить свои данные только после завершения анализа. В методе делегата называется parserDidEndDocument: выпуск данных.

Надеюсь, это поможет.

Thierry

Другие вопросы по тегам