2

過去に、Snow Leopard (または古い Mac OS X) で何かをコンパイルし、Lion 以降で利用可能な @selector を使用しなければならなかったとき、私は次のようなことをしました:

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

そして、これはうまくいきました。そのため、フロートを返す新しいメソッドに対して同じことをしようとしていますが、次の行:

float f = [foo awesomeLionSelectorWhichReturnsFloat];

コンパイル エラーをスローします:「代入で 'objc_object*' を 'float' に変換できません」。これは、コンパイラがメソッドを認識せず、戻り値の型を 'id' と見なさなければならないためです。

これを修正する適切な方法は何ですか?

4

2 に答える 2

2

編集: John Caswell のコメントによると、使用する正しいランタイム関数はobjc_msgSend_fpret()double を返す です。

objc_msgSend_stret()で自分のやり方を試してみるべきだと思います:

objc_msgSend_stret

データ構造の戻り値を持つメッセージをクラスのインスタンスに送信します。

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

何かのようなもの:

objc_msgSend_stret(&myFloatReturnValue, foo, @selector(awesomeLionSelector));
于 2012-06-21T17:39:18.710 に答える
2

最もエレガントな修正ではありませんが、それでもなお修正です。

#ifdef SnowLeopard
float f = [foo awesomeLionSelectorWhichReturnsFloat];
#endif
于 2012-06-21T17:38:10.847 に答える