2009-03-26 5 views
3

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

Прежде чем я отправлю отчет об ошибке 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 'где' выход, который указывает на [выпуска парсера]:

#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 

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

+0

ли фрагмент метод вы показываете здесь в MyParserClass, и это [анализатор релиз] на линии 60? –

+0

Брент: Это правильно. –

ответ

4

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

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

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

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

0

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

+0

Я читал, что NSXMLParser не очень хорошо работает с несколькими потоками, так что да, я синхронизировал его распределение и освобождение. Что касается NSXMLParser, это должно устранить проблему с несколькими потоками проблемы, я бы подумал. –

+0

Что касается методов делегатов, я просто не вижу, что я мог бы там делать, чтобы связать с тем, почему происходит неудачный доступ к освобождению NSXMLParser. Это довольно странно. Спасибо за ваши комментарии. –

0

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

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

Thierry

0

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

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

Thierry