2 Stimmen

Nicht verfügbare Objective-C-Selektoren mit skalaren Rückgabewerten

Früher, als ich etwas auf Snow Leopard (oder einem älteren Mac OS X) kompilieren musste und einen @selector verwendet habe, der auf Lion und höher verfügbar ist, habe ich etwas Ähnliches gemacht:

if([foo respondsToSelector:@selector(awesomeLionSelector)]) {
    [foo awesomeLionSelector]
}

Und das hat super funktioniert. Also versuche ich jetzt das Gleiche für eine neue Methode zu machen, die einen Float-Wert zurückgibt, aber die folgende Zeile:

float f = [foo awesomeLionSelectorWhichReturnsFloat];

wirft einen Kompilierungsfehler: "cannot convert 'objc_object*' to 'float' in assignment". Das liegt daran, dass der Compiler nichts von der Methode weiß und einen Rückgabetyp von 'id' annehmen muss.

Wie kann man das richtig beheben?

2voto

Michael Boselowitz Punkte 2987

Nicht die eleganteste Lösung, aber immerhin eine Lösung.

#ifdef SnowLeopard
float f = [foo awesomeLionSelectorWhichReturnsFloat];
#endif

2voto

sergio Punkte 68479

ÄNDERUNG: Laut Kommentar von John Caswell ist die korrekte Laufzeitfunktion, die verwendet werden soll, objc_msgSend_fpret(), die einen Double-Wert zurückgibt.

Ich denke, du solltest es auf deine Weise versuchen mit: objc_msgSend_stret():

objc_msgSend_stret

Sendet eine Nachricht mit einem Datenstruktur-Rückgabewert an eine Instanz einer Klasse.

  void objc_msgSend_stret(void * stretAddr, id theReceiver, SEL theSelector,  ...)

Etwas ähnliches wie:

objc_msgSend_stret(&myFloatReturnValue, foo, @selector(awesomeLionSelector));

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X