有谁知道为什么 NextStep/Apple 决定在向 Nil 对象传递消息时采取什么都不做的“便捷方法”,而在将实例化对象传递给无效选择器时采用引发异常的“Java 方法”?
例如,
// This does "nothing"
NSObject *object = Nil;
[object thisDoesNothing];
object = [[NSObject alloc] init];
// This causes an NSInvalidArgumentException to be raised
[object thisThrowsAnException];
所以一方面,我们可以方便地不必检查 Nil(假设我们不太关心方法调用的结果)——但另一方面,我们必须检查我们的对象是否有异常不响应方法?
如果我不确定对象是否会响应,我要么必须:
@try {
[object thisThrowsAnException];
} @catch (NSException *e){
// do something different with object, since we can't call thisThrowsAnException
}
或者,
if([object respondsToSelector:@selector(thisThrowsAnException)]) {
[object thisThrowsAnException];
}
else {
// do something different with object, since we can't call thisThrowsAnException
}
(后者可能是更好的方法,因为如果 object 为 Nil,则选择器不会引发异常,因此您的代码可能不会按照您希望的方式运行)。
我的问题是:为什么 Apple 决定以这种方式实施它?
为什么不让对实例化对象的无法识别的选择器调用不引发异常?
或者,如果您尝试对其调用方法,为什么不让 Nil 对象引发异常呢?