你很近。缺少的是在尝试运行之前检查方法是否存在,然后捕获任何异常的能力。
C4's是'srunMethod
的包装器,它通过要求字符串作为方法的名称而不是传递选择器来隐藏使用选择器。在您的情况下,您真的想寻找选择器来确定您是否可以运行该方法。NSObject
performSelector
以下作品:
-(void)setup {
NSArray *methodNames = @[@"aMethod",@"method2",@"anotherMethod"];
for(int i = 0; i < methodNames.count; i++) {
NSString *currentMethod = methodNames[i];
if ([self respondsToSelector:NSSelectorFromString(currentMethod)]) {
[self runMethod:currentMethod afterDelay:0];
} else {
C4Log(@"does not respond to %@",currentMethod);
}
}
}
-(void)aMethod{
C4Log(NSStringFromSelector(_cmd));
}
-(void)anotherMethod{
C4Log(NSStringFromSelector(_cmd));
}
这个的输出是:
[C4Log] does not respond to method2
[C4Log] aMethod
[C4Log] anotherMethod
在您的情况下也可能发生的情况是 try-catch 实际上没有传递异常,因为 runMethod
实际上执行得很好。延迟将您正在运行的方法的执行放到下一个运行循环上,这就是它实际上的时间失败。
你也可以试试:
NSString * slidename = [NSString stringWithFormat:@"showSlide%d", counter];
@try {
[self performSelector:NSSelectorFromString:(slidename)];
}
@catch (NSException *exception) {
NSLog(@"Exception: %@", exception);
}
@finally {
}
哪个应该立即执行该方法。