使用respondsToSelector:好风格?

时间:2010-10-02 21:37:43

标签: objective-c coding-style

发送消息是否是“更好的风格”并希望对象响应,或者检查它是否响应选择器并且如果不响应则进行某种后退。

例如:

- (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]];
    }
}

VS

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

(示例来自NSNumberFormatter子类......但可以来自NSObjectFormatter子类...)

2 个答案:

答案 0 :(得分:2)

如果您不是100%确定来到您的(stringForObjectValue)函数的所有实例都响应选择器,那么您必须执行该检查以避免在运行时崩溃。

如果处理obj未响应intValue选择器的情况,可能取决于使用方法的特定上下文。例如,在这种情况下你可以从方法中返回nil对象,这样你就可以很容易地看到出错了

答案 1 :(得分:1)

如果你不知道确切的类型,那么使用respondsToSelector:肯定是好的风格,因为否则会冒一个例外。而且这个技术的名称非常重要:Duck Typing