performSelector の戻り値: NSDateComponents (int を返す) の「week」など、(オブジェクトの) プリミティブ型を返すセレクターを渡すと?
20238 次
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 に答える