使用 respondsToSelector: 是一个好的编程风格吗?

3

在IT技术方面,发送消息并希望对象响应是否比检查对象是否响应某个选择器并有一些备选方案更好呢?

例如:

- (NSString *)stringForObjectValue:(id)obj {
    if ([obj respondsToSelector:@selector(intValue)]) {
        NSString *roman = [self formatRomanNumber:[obj intValue] resultSoFar:@""];
        return roman;
    } else {
        return [NSString stringWithFormat:@"can't format a %@", [obj class]];
    }
}

比对。

- (NSString *)stringForObjectValue:(id)obj {
    NSString *roman = format_roman(@"", [obj intValue]);
    return roman;
}

(这个例子来自一个NSNumberFormatter子类...但它也可能来自一个NSObjectFormatter子类...)
2个回答

2

如果您不能百分之百确定传递给(stringForObjectValue)函数的所有实例都响应选择器,则必须执行该检查以避免运行时崩溃。

obj未响应intValue选择器时,如何处理可能取决于使用您的方法的特定上下文。例如,在这种情况下,您可以从方法中返回nil对象,以便轻松地看到出现了问题。


1

如果您不知道确切的类型,那么使用respondsToSelector:绝对是一个好习惯,因为否则会出现异常。这一点非常重要,以至于这种技术有一个名字:鸭子类型


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接