41

performSelector の戻り値: NSDateComponents (int を返す) の「week」など、(オブジェクトの) プリミティブ型を返すセレクターを渡すと?

4

5 に答える 5

85

NSInvocation を使用して float を返す例:

SEL selector = NSSelectorFromString(@"someSelector");
if ([someInstance respondsToSelector:selector]) {
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:
                                [[someInstance class] instanceMethodSignatureForSelector:selector]];
    [invocation setSelector:selector];
    [invocation setTarget:someInstance];
    [invocation invoke];
    float returnValue;
    [invocation getReturnValue:&returnValue];
    NSLog(@"Returned %f", returnValue);
}
于 2012-06-11T02:07:17.787 に答える
9

performSelector から戻り値を取得できないと思います。を調べる必要がありますNSInvocation

于 2011-06-27T11:23:18.190 に答える
3

質問の 2 番目の部分に答えるために、プリミティブを返すセレクターを呼び出す別の方法は、関数ポインターを取得し、そのように呼び出すことです (someSelector が float を返し、引数を持たないと仮定します);

SEL selector = NSSelectorFromString(@"someSelector");
float (*func)(id,SEL) = (float (*)(id,SEL))[someInstance methodForSelector: selector];
printf("return value is: %f", (func)(someInstance, selector));
于 2015-01-23T03:40:34.193 に答える
2

dizy の提案どおりに実装された NSInvocation を試してみましたが、期待どおりに動作しました。

私も別の方法を試しました

int result = objc_msgSend([someArray objectAtIndex:0], @selector(currentPoint));

上記の場合、ブログで説明されているように、コンパイラをバイパスし、objc_msgSend 呼び出しを明示的に挿入してい ます。

この場合、次の警告が表示 されました。ライブラリ関数を直接呼び出しているため、型が 'id (id, SEL, ...)' のライブラリ関数 'objc_msgSend' を暗黙的に宣言しています。

それで、私は完全にうまく機能している NSInvocation を実装しました。

于 2015-04-23T10:37:32.433 に答える