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
}
(オブジェクトが Nil の場合、セレクターは例外を発生させないため、後者がおそらくより良い方法です。そのため、コードが意図したとおりに動作しない可能性があります)。
私の質問は、なぜ Apple はこのように実装することにしたのですか?
インスタンス化されたオブジェクトへの認識されないセレクター呼び出しで例外が発生しないのはなぜですか?
あるいは、Nil オブジェクトでメソッドを呼び出そうとした場合に、Nil オブジェクトで例外を発生させてみませんか?