通过字符串运行一串方法并接收一个值
问题描述:
我有一堆返回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");
答
创建一个类财产
@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的
完美! ! !谢谢! – SpaceDog