Кто-нибудь знает, почему 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 исключение, если вы попытаетесь вызвать метод на нем?