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