1

我正在尝试制作一个演示应用程序,并且我已经构建了一些将对象放到画布上的方法。我想做的是使用字符串连接来调用方法(每个方法都以其幻灯片索引命名)。当我调用一个方法runMethod时,如果我调用一个不存在的方法,它会崩溃。我试图将它包装在 try/catch/final 结构中,但应用程序仍然崩溃。

NSString * slidename = [NSString stringWithFormat:@"showSlide%d", counter];

@try {
    [self runMethod:slidename afterDelay:0];
}
@catch (NSException *exception) {
    NSLog(@"Exception: %@", exception);
}
@finally {
}
4

1 回答 1

1

你很近。缺少的是在尝试运行之前检查方法是否存在,然后捕获任何异常的能力。

C4's是'srunMethod的包装器,它通过要求字符串作为方法的名称而不是传递选择器来隐藏使用选择器。在您的情况下,您真的想寻找选择器来确定您是否可以运行该方法。NSObjectperformSelector

以下作品:

-(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 {
}

哪个应该立即执行该方法。

于 2014-05-19T19:14:10.683 回答