performSelector的返回值:

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

  • MySQL查询以获得有限的许多查询的“交集”
  • 用javascript创build唯一的ID
  • 用span展开选定的文本节点
  • SQL多重联接语句
  • 在jQuery中获取SELECT的值和文本
  • jQuery /以编程方式在select框中select一个选项
  • 从今天selectlogging,本周,本月php mysql
  • ruby on rails f。select带自定义属性的选项
  • 5 Solutions collect form web for “performSelector的返回值:”

    使用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