performSelector的返回值:

performSelector的返回值是什么:如果我传递一个select器,返回一个原始types(在对象上),比如NSDateComponents上的“week”(将返回一个int)?

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

我想你不能从performSelector获取返回值。 你应该看看NSInvocation

为了回答问题的第二部分,调用返回原语的select器的另一种方法是获得一个函数指针并像这样调用它,如(假设someSelector返回一个float并且没有参数)。

 SEL selector = NSSelectorFromString(@"someSelector"); float (*func)(id,SEL) = (float (*)(id,SEL))[someInstance methodForSelector: selector]; printf("return value is: %f", (func)(someInstance, selector)); 

我尝试按照dizy的build议实施NSInvocation,它按预期工作。

我也尝试了另一种方式,即

 int result = objc_msgSend([someArray objectAtIndex:0], @selector(currentPoint)); 

在上面的例子中,我们正在绕开编译器并显式插入objc_msgSend调用,如下所示: http : //www.cocoawithlove.com/2011/06/big-weakness-of-objective-c-weak-typing.html

在这种情况下,我得到以下警告: 隐式地声明types为“id(id,SEL,…)”的库函数“objc_msgSend”,这是显而易见的,因为我们直接调用了库函数。

所以,我实施了NSInvocation这对我来说工作得非常好。

老问题的新答案〜

有一个更简洁的方式从performSelector获取返回值

 NSInvocationOperation *invo = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(height) object:nil]; [invo start]; CGFloat f = 0; [invo.result getValue:&f]; NSLog(@"operation: %@", @(f)); 

在哪

 - (CGFloat)height { return 42; } 

产量

2017-03-28 16:22:22.378 redpacket[46656:7361082] operation: 42