通过字符串运行一堆方法并接收一个值
Posted
技术标签:
【中文标题】通过字符串运行一堆方法并接收一个值【英文标题】:Running a bunch of methods by string and receiving a value 【发布时间】:2014-01-20 18:48:37 【问题描述】:我有一堆返回布尔值的方法。这些是检查 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 return 不会返回一个 BOOL 值
我该怎么做?
【问题讨论】:
【参考方案1】:我相信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");
【讨论】:
P E R F E C T ! ! !谢谢!【参考方案2】:创建一个类属性
@property BOOL failed;
在这些方法中,相应地更新失败的属性。 并在执行后
[self performSelector:selector withObject:nil afterDelay:0.0f];
检查失败。
【讨论】:
【参考方案3】:如果您在编译时知道方法签名(本例中为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 相比开销更少
【讨论】:
以上是关于通过字符串运行一堆方法并接收一个值的主要内容,如果未能解决你的问题,请参考以下文章