Frage

Program received signal:  “EXC_BAD_ACCESS”.
(gdb) bt
#0  0x30011940 in objc_msgSend ()
#1  0x30235f24 in CFRelease ()
#2  0x308f497c in -[UIImage dealloc] ()
#3  0x30236b78 in -[NSObject release] ()
#4  0x30a002a0 in FlushNamedImage ()
#5  0x30250a26 in CFDictionaryApplyFunction ()
#6  0x30a001a4 in _UISharedImageFlushAll ()
#7  0x30a00738 in +[UIImage(UIImageInternal) _flushCacheOnMemoryWarning:] ()
#8  0x3054dc80 in _nsnote_callback ()
#9  0x3024ea58 in _CFXNotificationPostNotification ()
#10 0x3054b85a in -[NSNotificationCenter postNotificationName:object:userInfo:] ()
#11 0x3054dbc0 in -[NSNotificationCenter postNotificationName:object:] ()
#12 0x30a00710 in -[UIApplication _performMemoryWarning] ()
#13 0x30a006a8 in -[UIApplication _receivedMemoryNotification] ()
#14 0x30a005d8 in _memoryStatusChanged ()
#15 0x30217416 in __CFNotificationCenterDarwinCallBack ()
#16 0x3020d0b0 in __CFMachPortPerform ()
#17 0x30254a76 in CFRunLoopRunSpecific ()
#18 0x3025416a in CFRunLoopRunInMode ()
#19 0x320452a4 in GSEventRunModal ()
#20 0x308f037c in -[UIApplication _run] ()
#21 0x308eea94 in UIApplicationMain ()
#22 0x00002096 in main (argc=1, argv=0x2ffff514)

Zur Zeit habe ich einen sehr seltsamen Fehler in meinem Programm. Manchmal kommt es vor, und manchmal ist es nicht. Aber hier ist eine Zusammenfassung dessen, was vor sich geht:

Wenn das Programm startet:

  • gespeicherten Daten (nur eine kurze plist besteht aus 13 Elementen) geladen wird, wenn es vorhanden ist.
  • eine riesige plist enthält 1.014 Strings in NSMutableDictionary geladen.
  • eine andere plist 78 Strings enthält, in einer NSArray geladen wird.
  • ein .mp4-Film abgespielt wird.

Der Fehler tritt in einem Teil, in dem OpenGL ES-Ansicht entfernt wird und der Benutzer über eine der Saiten der 1014 Zeichenfolge in der NSMutableDictionary anzuzeigen.

Dieser Fehler nie im Simulator auftreten. Es tritt nur auf dem iPhone, und manchmal läuft es gut, aber manchmal zerdrückt es.

Doch nach der Lektüre Stacktrace, ich sehe CFDictionaryApplyFunction drin, so dachte ich, es eine der möglichen Ursachen sein könnte. Ist es, weil auf dem Simulator, es Dinge liest sich so schnell, dass das ganze Wörterbuch aus dem plist zu einem Zeitpunkt geladen wird, während auf dem Gerät, es langsamer liest? Ehrlich gesagt, ich weiß nicht genau, wie das Wörterbuch funktioniert. Ist es alle 1014 Strings zu einem Zeitpunkt durchlesen, oder es nutzt einige andere Threads langsam zu lesen? Bitte Beratung. Danke.

War es hilfreich?

Lösung

Wenn Sie eine EXC_BAD_ACCESS bekommen, ist es oft heißt, Sie versuchen, eine Methode für ein Objekt aufrufen, die nicht da ist -. Wahrscheinlich, weil es ausgeplant worden

über die Mitte der Spur, gibt es einige Speicher Warnung Anrufe, wie zum Beispiel:

#12 0x30a00710 in -[UIApplication _performMemoryWarning] ()

Welche macht es erscheinen, dass keine Ihrer Code ist direkt was den Absturz, sondern ein System-Benachrichtigung, wenn der Speicher knapp wird.

Closer # 0 zu gestalten, wie es scheint, den Cache eines UIImage Objekts zu löschen versucht zu werden, und dies scheint der schlechte Zugang zu sein.

Auf dieser Basis, eine Vermutung ist, dass Sie einen Zeiger auf den Autoreleased Rückgabewert einer Komfort-Konstruktor sind zuzuweisen; dann wird das Objekt Autoreleased, und man könnte es denkt in Ordnung, weil Sie das Bild verwenden, nicht direkt, aber die Erinnerung Warnung versucht, darauf zuzugreifen. Zum Beispiel:

@interface MyClass {
  UIImage* myImage;
}
// ...
- (id) init {  /* the usual stuff */
  myImage = [UIImage imageNamed:@"bob_the.png"];
  return self;
}

In diesem Beispiel, auch wenn Sie haben eine Retain Eigenschaft am myImage einrichten, sind Sie nicht wirklich das Bild behalten, wenn Sie den Wert über self.myImage eingestellt. Also, kurz nach diesem Aufruf wird das Bild freigegeben, und Sie haben einen Zeiger auf Niemandsland bekommen.

Ohne den Code zu sehen, habe ich keine Möglichkeit zu wissen, ob das, was eigentlich vor sich geht, aber es ist eine Art von Fehler, die leicht zu machen.

Diese Fragen geben Tipps für Ähnliche Abstürze: EXC_BAD_ACCESS Debuggen Frage 1 und Frage 2 .

Schließlich, wenn nichts davon hilft, schlage ich vor der Suche nach einer minimalen Wiedergabe Ihrem Problems. Der harte Weg, dies zu tun ist, um Ihren Code zu kopieren, halb ausgeschnitten, ob der Fehler immer noch da, und wiederholen, bis Sie die kleinste Code bekommen können Sie den Fehler finden, die wiedergibt. Es ist in der Regel viel leichter zu debuggen, von dort (und mehr bebuchbare als Stackoverflow Frage, auch!) Wenn Sie die einfache Möglichkeit kennen, lassen Sie es mich wissen.

Andere Tipps

Sie möchten die NSZombiesEnabled Umgebungsvariable setzen. Auf diese Weise Ihre App wird nicht mit EXC_BAD_ACCESS abstürzen, wenn freigegeben Zugriff auf Objekte, sondern protokolliert eine informative Nachricht an die Konsole. Dieser Blog-Eintrag ziemlich gut erklärt, was passiert, und wie es eingerichtet in XCode auf. Wie auch immer, NIEMALS vergessen Sie diese Option in Produktions-Releases zu deaktivieren, da sonst Ihre Objekte nie freigegeben werden!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top