发送消息是否是“更好的风格”并希望对象响应,或者检查它是否响应选择器并且如果不响应则进行某种后退。
例如:
- (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子类...)
答案 0 :(得分:2)
如果您不是100%确定来到您的(stringForObjectValue)函数的所有实例都响应选择器,那么您必须执行该检查以避免在运行时崩溃。
如果处理obj
未响应intValue
选择器的情况,可能取决于使用方法的特定上下文。例如,在这种情况下你可以从方法中返回nil对象,这样你就可以很容易地看到出错了
答案 1 :(得分:1)
如果你不知道确切的类型,那么使用respondsToSelector:
肯定是好的风格,因为否则会冒一个例外。而且这个技术的名称非常重要:Duck Typing。