有谁知道为什么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];
Run Code Online (Sandbox Code Playgroud)
所以一方面,我们有方便不必检查Nil(假设我们不太关心方法调用的结果) - 但另一方面,如果我们的对象,我们必须检查异常没有回应方法?
如果我不确定该对象是否会响应,我要么:
@try {
[object thisThrowsAnException];
} @catch (NSException *e){
// do something different with object, since we can't call thisThrowsAnException
}
Run Code Online (Sandbox Code Playgroud)
要么,
if([object respondsToSelector:@selector(thisThrowsAnException)]) {
[object thisThrowsAnException];
}
else {
// do something different with object, since we can't call thisThrowsAnException
}
Run Code Online (Sandbox Code Playgroud)
(后者可能是更好的方法,因为如果object为Nil,则选择器不会引发异常,因此您的代码可能不会按照您希望的方式运行).
我的问题是:为什么Apple决定以这种方式实施它?
为什么不对实例化对象进行无法识别的选择器调用而不引发异常?
或者,如果您尝试在其上调用方法,为什么不让Nil对象引发异常?
objective-c ×1