目标C>有没有办法检查Selector返回值?

时间:2013-01-30 11:25:56

标签: ios objective-c selector return-value

假设我有一个可以分配给多个不同方法的选择器 - 每个方法都有不同的返回值。

有没有办法在调用“performSelector”之前检查选择器持有的方法的返回值是什么?

4 个答案:

答案 0 :(得分:8)

  

有没有办法在调用“performSelector”之前检查选择器持有的方法的返回值是什么?

值?号码类型?邑。您似乎想要方法的返回类型(或者您的问题没有意义)。

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

然后,您可以在type中检查返回的类型字符串。例如,"v"表示无效(google完整列表)。

答案 1 :(得分:7)

您可以使用Apple Docs中推荐的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);
}

答案 2 :(得分: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

答案 3 :(得分:-1)

performSelector:始终返回id。返回的实际类型由您调用的方法确定;所以事先没办法知道。