2009-03-26 15 views
3

Ich sehe einen zeitweiligen Absturz bei [Parser-Release]. Ich würde sagen, ich sehe es etwa 5% der Zeit, und die Daten, die ich analysiere variiert zwischen den einzelnen Abstürzen. Ich kann nicht für das Leben von mir herausfinden, warum.EXC_BAD_ACCESS Absturz beim Freigeben von NSXMLParser

Bevor ich einen Fehlerbericht an Apple übergebe (was mit meinem Glück im Beispielcode nicht reproduzierbar sein wird), ist jemand darauf gestoßen und weiß, was passieren könnte?

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]; 

Und hier ist der GDB 'wo' Ausgang, der mit [Parser release]-Punkte:

#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 

Vielen Dank im Voraus für jede Hilfe!

+0

Ist die Methode Fragment Sie hier in MyParserClass sind zeigt, und ist der [Parser release] auf der Leitung 60? –

+0

Brent: Das ist richtig. –

Antwort

4

Ich glaube, ich es herausgefunden - ein Code an anderer Stelle in der App verwendet XML-Funktionen wie:

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

Diese Funktionen wahrscheinlich in einem anderen Thread zur gleichen Zeit ausführen ich den Code-Fragment bin Ausführung I posted . NSXMLParser nutzt offensichtlich die gleichen Funktionen unter der Haube.

Ich habe dem anderen Code einen synchronisierten Block hinzugefügt, der das gleiche Sperrobjekt verwendet, das ich für meine NSXMLParser-Verwendung verwende, und die Abstürze scheinen verschwunden zu sein. Ich denke, die Lektion hier ist, dass diese XML-Funktionen absolut nicht threadsicher sind - Vorsicht!

0

Es sieht so aus, als ob Sie mehrere Threads verwenden. Es könnte ein Problem damit geben. Threading Bugs zeigen sich oft sporadisch. Möglicherweise haben Sie auch einen Fehler in Ihren Parser-Delegate-Methoden, den Sie hier nicht veröffentlicht haben.

+0

Ich habe gelesen, dass NSXMLParser nicht gut mit mehreren Threads funktioniert, also ja, ich habe um seine Zuteilung und Freigabe synchronisiert. Soweit der NSXMLParser betroffen ist, sollte dies den multiplen Threadwinkel des Problems entfernen, würde ich denken. –

+0

Was die Delegate-Methoden angeht, sehe ich einfach nicht, was ich dort tun könnte, was mit einem schlechten Zugriff beim Freigeben des NSXMLParsers zusammenhängen würde. Es ist ziemlich seltsam. Danke für deine Kommentare. –

0

Sie müssen Ihre Daten nur löschen, wenn die Analyse abgeschlossen ist. In der Delegat-Methode namens parserDidEndDocument: Daten freigeben.

Hoffe diese Hilfe.

thierry

0

Sie müssen Ihre Daten nur löschen, wenn das Parsen ist abgeschlossen. In der Delegate-Methode namens parserDidEndDocument: Daten freigeben.

Hoffe diese Hilfe.

thierry