objc_retain EXC_BAD_ACCESS

7

Ich hatte beim Testen auf iOS 6 mit meiner aktuellen iOS 5 App einen kleinen Fehler.

Wir haben festgestellt, dass eine Methodenrückgabe für eine unschädliche Methode gesperrt ist, die intern verwendete Blöcke verwendet, aber nicht als Eigenschaften. Das Problem besteht darin, dass der Aufruf der Methode funktioniert, ebenso wie jede Codezeile innerhalb der Methode (einschließlich des Blocks, der Code verwendet)

Ich habe versucht, [block copy] vor dem Aufruf des Blocks, aber es gab absolut keine Änderung.

    
The Lazy Coder 14.09.2012, 04:13
quelle

1 Antwort

20

stellt fest, dass die Funktionsdefinition meines Codes in einer internen Schnittstelle deklariert wurde und keinen Rückgabetyp hatte.

Hier finden Sie einige Grafiken zur Veranschaulichung dieses Problems.

Der anfängliche Fehler

Die Stapelspur

Die fragliche Methode (isoliert von sich selbst, um den genauen Ort des Problems zu bestimmen)

Die Funktionsimplementierung (dies wird aufgerufen und zurückgegeben)

Die Definition in der privaten Schnittstelle

Ich entschied mich, den Funktionsaufruf zu betrachten, und bemerkte, dass er zurückkehrte (id) anstatt void

Und schließlich die einzige Codeänderung, die diesen Fehler behoben hat.

Erläuterung

Dieser Fehler hat seinen hässlichen Kopf bekommen, als mein Klient mich angerufen hat, dass unsere App nicht auf ios 6 läuft

Ich wurde gezwungen, iOS 6 und Xcode 4.5 herunterzuladen, um das auszuprobieren.

Ich stürzte tatsächlich jedes Mal ab, wenn die App ausgeführt wurde.

Nachdem ich diesen Fehler beim Stack-Überlauf zwischen anderen mit Google verknüpften Websites gejagt habe, habe ich das Block-Problem versucht, das bei einigen anderen auftritt. Und habe eine Kopie gemacht, wo immer ich konnte, um zu versuchen, das Problem des zurückgehaltenen Objekts, das vom Stapel fällt, zu lindern.

Ich habe Blockeigenschaften nicht verwendet, also habe ich einfach die Blöcke selbst aufgerufen.

Das hat nicht geholfen.

Endlich mit einem anderen Entwickler, der es mit mir durchgeht. Ich trat zurück und schaute es aus einem anderen Blickwinkel an und beschloss zu versuchen, zu bestimmen, was zum Teufel zurückgehalten wurde.

Es stellte sich heraus, dass das Ergebnis der Funktion beibehalten wurde. Und die einzige Möglichkeit, das herauszufinden, war, den Wert zu betrachten, den die automatische Vervollständigung als Rückgabetyp zeigte.

Ich wusste, dass der Rückgabetyp ungültig ist, aber mir wurde gesagt, dass der Rückgabetyp id ist und das hat die Untersuchung der Methodendefinition ausgelöst.

Ich hoffe, dass dies anderen hilft, die dieses Problem haben, da ich ungefähr zwei Stunden damit verbracht habe, es zu finden, und es stellte sich heraus, dass es ein semantisches Problem zwischen einem Ergebnistyp war, der niemals existiert haben sollte.

    
The Lazy Coder 14.09.2012, 04:13
quelle

Tags und Links