4

いくつかの異なるメソッドに割り当てることができるセレクターがあるとしましょう-それぞれが異なる戻り値を持っています。

「performSelector」を呼び出す前に、セレクターが保持しているメソッドの戻り値を確認する方法はありますか?

4

4 に答える 4

9

「performSelector」を呼び出す前に、セレクターが保持しているメソッドの戻り値を確認する方法はありますか?

価値?いいえ、タイプしますか?うん。メソッドの戻り型が必要なようです(または、質問が意味をなさないでしょう)。

Method m = class_getInstanceMethod([SomeClass class], @selector(foo:bar:));
char type[128];
method_getReturnType(m, type, sizeof(type));

次に、で返された型文字列を調べることができますtype。たとえば、"v"void(完全なリストをグーグルで検索)を意味します。

于 2013-01-30T11:37:51.450 に答える
7

この目的のために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);
}
于 2013-01-30T11:29:43.950 に答える
1

メソッドがオブジェクトを返さない(プリミティブ型を返す)場合は、代わりにNSInvocationを使用してください。

@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
于 2014-03-21T13:23:25.300 に答える
-1

PerformSelector:常に。を返しますid。返される実際のタイプは、呼び出すメソッドによって決まります。したがって、事前にそれを知る方法はありません。

于 2013-01-30T11:33:45.803 に答える