いくつかの異なるメソッドに割り当てることができるセレクターがあるとしましょう-それぞれが異なる戻り値を持っています。
「performSelector」を呼び出す前に、セレクターが保持しているメソッドの戻り値を確認する方法はありますか?
いくつかの異なるメソッドに割り当てることができるセレクターがあるとしましょう-それぞれが異なる戻り値を持っています。
「performSelector」を呼び出す前に、セレクターが保持しているメソッドの戻り値を確認する方法はありますか?
「performSelector」を呼び出す前に、セレクターが保持しているメソッドの戻り値を確認する方法はありますか?
価値?いいえ、タイプしますか?うん。メソッドの戻り型が必要なようです(または、質問が意味をなさないでしょう)。
Method m = class_getInstanceMethod([SomeClass class], @selector(foo:bar:));
char type[128];
method_getReturnType(m, type, sizeof(type));
次に、で返された型文字列を調べることができますtype
。たとえば、"v"
void(完全なリストをグーグルで検索)を意味します。
この目的のためにAppleDocsで推奨されているNSInvocationを使用することができます
NSInvocationを使用するためのサンプルコードを次に示します。
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);
}
@implementation NSObject(SafePerformSelector)
-(id) performSelectorSafely:(SEL)aSelector;
{
NSParameterAssert(aSelector != NULL);
NSParameterAssert([self respondsToSelector:aSelector]);
NSMethodSignature* methodSig = [self methodSignatureForSelector:aSelector];
if(methodSig == nil)
return nil;
const char* retType = [methodSig methodReturnType];
if(strcmp(retType, @encode(id)) == 0 || strcmp(retType, @encode(void)) == 0){
return [self performSelector:aSelector];
} else {
NSLog(@"-[%@ performSelector:@selector(%@)] shouldn't be used. The selector doesn't return an object or void", [self class], NSStringFromSelector(aSelector));
return nil;
}
}
@end
PerformSelector:常に。を返しますid
。返される実際のタイプは、呼び出すメソッドによって決まります。したがって、事前にそれを知る方法はありません。