特に、Objective-Cランタイム関数を確認することをお勧めしますobjc_msgSend_fpret
。
double objc_msgSend_fpret( id self, SEL op, ... )
これは、浮動小数点の戻り値を持つメッセージをクラスのインスタンスに送信します。
performSelector
メソッドは、型を返すを使用しobjc_msgSend
ますid
。
例えば:
double res = objc_msgSend_fpret( obj, @selector( blah ) );
このobjcランタイムヘッダーをインポートする必要があります。
#import <objc/message.h>
編集
ちなみに、ObjCランタイムリファレンスへのリンクは次のとおりです:http:
//developer.apple.com/library/mac/#documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html
編集2-重要
objc_msgSend_fpret
CPUアーキテクチャ(基本的にはi386またはx86_64)に応じて、さまざまな方法で実装されます。
コメントで述べたように、これらの関数はアセンブリを使用して実装されるため、実装はCPUアーキテクチャに依存します。
x86_64アーキテクチャでは、この関数はを返しますlong double
。
これが、に割り当てるときに失敗する(そしてNANを返す)理由ですdouble
。
また、objc_msgSend_fp2ret関数があることに注意してください。
したがって、基本的に、前の例は機能しません。
double x = objc_msgSend_fpret( obj, @selector( blah ) );
printf( "Val: %f\n", x );
お気づきのように、「NAN」と表示されます。
それを機能させるには、次のようにする必要があります。
long double x = objc_msgSend_fpret( obj, @selector( blah ) );
printf( "Val: %Lf\n", x );
実例は次のとおりです。
http://www.eosgarden.com/uploads/misc/fp.m
以下を使用してコンパイルします。
gcc -Wall -framework Foundation -o fp fp.m