2014-02-18 9 views
5

Eigentlich funktioniert mein ursprünglicher Code groß mit Xcode 5.0.2 und großen auch App Store für das Senden, das ist:obj_msgSend Funktionszeiger Absturz beim Build mit 64-Bit-arm64

objc_msgSend(self.target, self.successAction, category); 

Diese Zeile verursacht Abstürze mit Xcode5.1 beta5 . Ich fand eine Lösung den Absturz zu beheben: SudzC ARC version - objc_msgSend call causes EXC_BAD_ACCESS using 64-bit architecture

// solution 
id (*response)(id, SEL, id) = (id (*)(id, SEL, id)) objc_msgSend; 
response(self.target, self.successAction, category); 

Und ich bekomme kein Problem entweder alle Xcode 5 oder Xcode5.1beta mit auf Geräten (iPhone 5s) oder Simulator (32bit oder 64bit) zu testen, bei der Verwendung von die empfohlene Lösung. Die Architektur, die in den Buildeinstellungen festgelegt wird, lautet "Standardarchitekturen (armv7, armv7s)" in Xcode 5 und "Standardarchitekturen (armv7, armv7s, arm64)".

Allerdings ist meine neue Version der App heute im App Store zum Verkauf bereit. Und es stürzt auf allen installierten Geräten (iPhone 5s, 5, 4s) ab (laut Crashlytics-Bericht). Da ich den Absturz mit Xcode (Build to Real Device) nicht bekomme, weiß ich nicht, ob ich das Problem behebe oder nicht, bevor es von Apple überprüft wird.

Antwort

9

Endlich kann ich den Absturz jetzt reproduzieren. Bearbeiten Sie einfach Build Scheme und ändern Sie "Run YOURAPPNAME.app" von Debug zu Release.

Und direkt nachdem ich diesen Fehler reproduzieren kann, weiß ich, wie man es behebt. Da mein Auswahlfunktionstyp leer ist (nichts zurückgibt), sollte ich nicht einfach kopieren, was die Frage tut (mit "id").

Durch Änderung:

id (*response)(id, SEL, id) = (id (*)(id, SEL, id)) objc_msgSend; 
response(self.target, self.successAction, category); 

An:

void (*response)(id, SEL, id) = (void (*)(id, SEL, id)) objc_msgSend; 
response(self.target, self.successAction, category); 

Es behebt !! Oder eine einzeilige Code dank this commit on github:

((void(*)(id, SEL, id))objc_msgSend)(self.target, self.successAction, category); 
+0

Vielen Dank, es ist mit mir zu arbeiten – wod

+0

OMG, du bist ein Zauberer! Weiß nicht, wie hast du darüber nachgedacht, aber es funktioniert wirklich! Herzlichen Dank an dich) – Miroslav