"Exc_bad_access: Der zuvor ausgewählte Frame kann nicht wiederhergestellt werden" - Stapelvariablen nicht aufgeräumt werden

StackOverflow https://stackoverflow.com/questions/9302521

Frage

Unter Bezugnahme auf die Frage hier.

Die in diesem Thread bereitgestellten Lösungen umfassen:

  1. Wenn Sie klug sind, wo und wie viele Variablen Sie erklären, würde das auf den Stapel gehen.
  2. Deaktivieren Sie bei Bedarf den Guard Malloc.

Im Allgemeinen: 3. Stellen Sie sicher, dass Sie eine Variable veröffentlichen, für die Sie tatsächlich Speicher zugewiesen haben !!

Ich habe keine der oben genannten Probleme. Es gibt nur sehr wenige Stack-zuallozierte Variablen, die ich in Funktionen verwende, z. B. 2-3 in jedem. Aber weil die Funktionen mehrmals in einer Schleife aufgerufen werden, scheint sie eine Ausnahme auszulösen.

Und hier ist der Kicker, dies geschieht nicht nur für staatlich zugewiesene Variablen, sondern auch auf dem Haufen! Ich erhalte die Seitenfehler bei automatisch veröffentlichten Erklärungen von NSNumber-Variablen, die ich ein paar Insider in der Schleife verwende, sowie ein Wörterbuch, das ich mit Bedacht, das ich mit Bedacht zugegeben und im Rahmen der Funktion freilasse, jedes Mal, wenn es aufgerufen wird, zu vergeben und freie.

Warum passiert das und warum zum Teufel werden Haufenvariablen betroffen? Ich verstehe es überhaupt nicht, bitte wirf etwas Licht darauf. :)

Ich bin auf iOS5 mit Xcode 4.2, iPhone/iPad -Simulator.

Vielen Dank!

Grüße, Dev

Bearbeiten: Beispielcode
- (void)doSomething {
NSInteger fun = 3;
NSInteger time = 4;
NSInteger overload = fun*time;
NSString *string = [NSString stringWithFormat:@"%d",overload];
NSObject *myCustomObject = [[NSObject alloc] init];
[myCustomDictionary setObject:myCustomObject forKey:string];
[myCustomObject release];
//myCustomDictionary is an iVar, alloced in the class's init method, and released in dealloc and not touched anywhere in between
}
//doSomething gets called several times through the course of execution as the state of the view changes, the user interacts with it etc, often 2-3 times during one state change.

Der Code ist absichtlich vage, aber gleichzeitig ist er genauso einfach wie in der Stichprobe. Wie der Rest des Code im gesamten Projekt. Mehrere Funktionen, die jeweils eine kleine Menge an Arbeit erledigen, so gut sich selbst in Bezug auf dieses Gedächtnis.

Ich habe mich zuvor mit exc_bad_access -Problemen befasst, und zu diesem Zeitpunkt hatte ich darauf hingewiesen Dies Frage. In meinem Fall habe ich jedoch nicht mehrere Variablen auf dem Stapel innerhalb einer Schleife erstellt, sie wurden wiederholt durch eine Funktion erstellt, die im Verlauf der Ausführung mehrmals aufgerufen wird. Im Idealfall sollten die Variablen am Ende des Funktionsskops gerade zerstört werden. Ich bin mir nicht sicher, warum das nicht passiert ist.

Wie auch immer, um dies zu lösen und um mehrere Zuteilungen zu verhindern, erklärte ich meine stapelgestützten Variablen wie alle static. Das ist schlechte Praxis, aber genau das musste ich tun, um es zum Laufen zu bringen. Und es funktionierte, bis ich mit der Funktion "Dosen etwas" wieder vor dem Problem stand.

Die Schwierigkeit in "Dosen" war also, dass ich nicht nur stapelgestützte Variablen erstellt hatte, sondern auch Haufen. Also habe ich zuerst angefangen, exc_bad_access auf die NStineger -Variablen zu bekommen, und an diesem Punkt habe ich versucht, sie erneut zu reparieren, indem ich sie als statisch deklarierte. Es hat funktioniert, aber jetzt trat exc_bad_access auf der automatisch veröffentlichten Variablen und schließlich auf der benutzerdefinierten Variablen auf-als ich stumpf wurde. Ich habe alle Regeln des Speichermanagements verfolgt und habe Stapel- und Haufen -Variablen über mich. Wenn es sich nur um Haufen oder Stapel in einer Schleife handelte, konnte ich verstehen, dass es irgendwo einen Fehler gibt. Aber hier ist es auch nicht, dass dies absolut unschuldige Variablen sind, die in einer Funktion, die nicht in einer Schleife aufgerufen wird, und regelmäßige automatisch veröffentlichte Variablen, die niemals erhalten oder freigegeben werden, von einem anderen Ort im Code geworfen werden. Was es noch schlimmer macht, ist, dass die Fehlerpunkte zufällig sind - nicht nur in dieser Funktion, sondern auch in praktisch jedem, der im Verlauf der Ausführung des Projekts mehrmals aufgerufen wird.

Edit2: Es stellt sich heraus, dass in diesem Fall meine Schuld ist. Weitere Informationen finden Sie in meiner Antwort. Tut mir leid, dass ich die Zeit der Menschen verschwendet habe. :

War es hilfreich?

Lösung 3

Ah Geez, ich glaube das nicht.

Die Probleme, mit denen die von Stack zu allokierten Nsinteger-Variablen zuvor konfrontiert waren, gilt, aber in diesem Fall war es ganz meine Schuld.

"Dosen etwas" war Teil einer langen Kette von Ereignissen, die aufgrund einer dummen Fahrlässigkeit meines Teils ein paar Mal ein paar Male verleihen, was zu Recht und wie es sein sollte, die Anwendung aus dem Speicher ausgeht . Egal, ob es sich um die Stapelvariablen oder die Mallozierten handelt, die auf dem Haufen sitzen, mit einer unendlichen Schleife, es wird auf die eine oder andere Weise abstürzen. :)

Der Absturz ist also vollkommen fair und wurde in diesem Fall mit einer früheren Ausgabe verwirrt, die sich als nicht verwandt herausstellte. :(

Tut mir leid, dass ich die Zeit aller verschwendet habe.

Andere Tipps

Wir können Ihnen nicht wirklich helfen, ohne die ganze Stapelspur zu sehen.EXC_BAD_ACCESS bedeutet nichts, um zu beheben, dass wir wissen müssen, wie die Ausnahme aussieht.

Basierend auf meiner Erfahrung, wenn Sie keinen Stack Tarce bekommen, bedeutet dies, dass Sie doppelt freigeben. Zombies ist der Weg, um Ihre doppelte Veröffentlichung zu finden.

Gehe zu: Product -> Profile und dann auswählen "Zombies"Aus der Liste. Führen Sie die App aus und führen Sie jede Aufgabe aus, die den Absturz verursacht. Wenn das Problem eine doppelte Veröffentlichung ist, würde ein Popup angezeigt werden. Wählen Sie den Pfeil im Popup aus und es zeigt genau, welches Objekt doppelt freigegeben wird und Es zeigt Ihnen den Reta -Zyklus.

Ohne Code, der in Ihrer Frage veröffentlicht wird, und wenn Sie sehen, dass Sie iOS 5 und Xcode 4.2 verwenden Edit>Refactor>Convert to Objective-C ARC Und winken Sie alle Ihre Speicherverwaltung Kopfschmerzen auf Wiedersehen.

ARC macht alle Speicherverwaltung für Sie. Sie müssen OVER -Methoden nicht behalten, veröffentlichen oder schreiben. Sie müssen sich in den meisten Fällen keine Sorgen um das Speichermanagement machen. Sie werden mysteriös lassen EXC_BAD_ACCESS stürzt zurück. Die Art und Weise, wie es funktioniert, ist super effizient. Der Compiler setzt die Halten ein und freisetzt für Sie und optimiert dann. Sie müssen den Code noch nie sehen.

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