EXC_BAD_ACCESS Wenn Sie die iPhone -App von 2.2 auf 3.0 Simulator verschieben
-
06-07-2019 - |
Frage
Nun, ich hatte eine App, die ich in iPhone SDK 2.2 entwickelt habe und kürzlich im 3.0 -Simulator gebaut und gestartet habe. Die Basis -SDK ist immer noch auf 2,2 eingestellt. Ich dachte, das würde Probleme vermeiden. Stattdessen bekomme ich
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x00000000a1b1c1f3
Crashed Thread: 0
Thread 0 Crashed:
0 libobjc.A.dylib 0x92f4b688 objc_msgSend + 24
1 Foundation 0x305085bd -[NSCFString isEqualToString:] + 61
2 HappyApp 0x00002c27 -[CombinationsTableViewController loadData] + 220 (CombinationsTableViewController.m:64)
Der Absturz erfolgt in einer sehr einfachen Linie, wo total
ist ein UITextField
if (![total.text isEqualToString:@""] ) {
Hat jemand das begegnet? Ich habe das Gefühl, dass es sich um ein Problem mit Thread -Konkurrenz handelt, oder meine ganze App kompiliert nicht richtig. Es funktioniert im 2.2.1 -Simulator. Wenn sich herausstellt, dass dies nicht der Weg ist, um eine 2.2 -App in OS 3.0 zu testen, was sollte ich dann tun, als das Dropdown -Box zu wechseln?
Aktualisieren: Andrew Pouliot hatte Recht, als dies ein veröffentlichtes Referenzproblem war. Der Debugger zeigte eine Zeile aus, damit ich die falschen Hinweise bekam. Der Täter war eigentlich diese erste Zeile:
if(!([total.text isEqual:totalTextCache]
&& [divisions.text isEqual:divisionsTextCache])) {
//Loads the data for the table only if the values were actually changed
totalTextCache = total.text; //ditto for divisions
}
Diese Zeilen sind die einzigen Verwendungen von totalTextCache
, und es wurde ungültig, wenn total.text
wurde verändert. Dies verursachte nie ein Problem in der 2.2.1 Sim wahrscheinlich, weil das alte total.text
wurde nie von der Laufzeit veröffentlicht, als es den Wert änderte. Aber dieser Code war falsch. Ich habe es behoben, indem ich es geändert habe, um genau das zu tun, was ich für ein Gleichgewicht hielt:
if(!(total.text==totalTextCache && divisions.text==divisionsTextCache))
Weil ich das eigentlich nicht kopieren wollte NSString
s, aber prüfen Sie einfach, ob sie sich geändert haben (und daher hätte sich die Referenz geändert, dies funktioniert. Der schlechte Code lief in der Laufzeit 2.2.1 gut, da die alte Referenz noch über die Hash -Eigenschaft überprüft und verglichen werden könnte isEqual
.
Lösung
Als ich meine 3.0 SDK installierte, sind meine 2.0 -Tools verschwunden. Ich bin mir also nicht sicher, ob dies anwendbar ist, aber ich glaube nicht, dass Simulator -Builds als binär kompatibel für zukünftige Laufzeiten ausgelegt sind.
Es ist jedoch wahrscheinlich, dass das Problem in Ihrem Code liegt. Wenn ja, kann ich sagen, dass Sie ein Problem mit der Speicherverwaltung haben und nicht "Thread -Konkurrenz". Alles passiert am Hauptfaden in UIKIT (nicht fadensicher).
Überprüfen Sie, wo Sie Ihre Gesamtvariable einrichten. Es wurde wahrscheinlich bereits veröffentlicht, als Sie diese Methode treffen. Stellen Sie sicher, dass Ihre Rückhaltung sinnvoll ist.
Haben Sie den gleichen Fehler, wenn Sie für 3.0 erstellen?