小编Mik*_*gue的帖子

为什么将任何选择器发送到Nil对象什么都不做,但是向任何NSObject发送"无效"选择器会引发异常?

有谁知道为什么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

11
推荐指数
2
解决办法
2449
查看次数

标签 统计

objective-c ×1