通过字符串运行一串方法并接收一个值

通过字符串运行一串方法并接收一个值

问题描述:

我有一堆返回bool值的方法。这些是检查n个条件的测试。如果其中一个返回YES,则该条件无效。类似于通过字符串运行一串方法并接收一个值

- (BOOL) areNumbersInvalid { 

} 

- (BOOL) areNumbersBigger { 

} 

// etc... 

有数百种方法。

其实我会这样运行了他们:

if ([self areNumbersInvalid]) { 
    [self failed]; 
} 

if ([self areNumbersBigger]) { 
    [self failed]; 
} 

// etc 

试想数以百计这样的线的每个方法。

比我想我可以有一个阵列上的所有方法的名字,并使用类似

[methods enumerateObjectsWithOptions:NSEnumerationConcurrent 
          usingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 

           NSString *oneMethod = (NSString *)obj; 
           SEL selector = NSSelectorFromString(oneMethod); 

           BOOL failed = [self performSelector:selector withObject:nil afterDelay:0.0f]; 

           if (failed) { 
           // do something 
           } 


          }]; 

,但我不能用这条线

BOOL failed = [self performSelector:selector withObject:nil afterDelay:0.0f]; 

因为这performSelector线预计void返回不会返回布尔值

我该怎么办呢?

我相信you can use NSInvocation for that

NSInvocation *invocation = [NSInvocation invocationWithMethodSignature: 
          [[someInstance class] instanceMethodSignatureForSelector:selector]]; 
[invocation setSelector:selector]; 
[invocation setTarget:someInstance]; 
[invocation invoke]; 
BOOL returnValue; 
[invocation getReturnValue:&returnValue]; 
NSLog(@"Returned %@", returnValue? @"YES" : @"NO"); 
+0

完美! ! !谢谢! – SpaceDog

创建一个类财产

@property BOOL failed; 

在这些方法中,相应地更新失败的属性。
和执行

[self performSelector:selector withObject:nil afterDelay:0.0f]; 

检查失败后。

如果你知道(在这种情况下BOOL (*)(id, SEL))在编译时的方法签名,你可以做到这一点

SEL selector = // ... 
id obj = // ... 
BOOL (*imp)(id, SEL); 
imp = (BOOL (*)(id, SEL))[obj methodForSelector:selector]; 
BOOL result = imp(obj, selector); // call it 

更少的开销比较NSInvocation的