我有一堆返回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值
我该怎么做?
答案 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 相比,开销更少