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

时间:2014-01-20 18:48:37

标签: ios iphone ipad cocoa-touch

我有一堆返回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返回不会返回BOOL值

我该怎么做?

3 个答案:

答案 0 :(得分:3)

我相信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");

答案 1 :(得分:0)

创建一个类属性

@property BOOL failed;

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

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

检查失败。

答案 2 :(得分:0)

如果您在编译时知道方法签名(在本例中为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

相比,开销更少