Objective C >>有没有办法检查Selector的返回值?

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

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

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

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

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

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

您可以使用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); } 

如果方法不返回对象(它返回基本类型),则改为使用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 

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