Что происходит, когда нет подходящего метода для сообщения Objective C? - PullRequest
4 голосов
/ 09 июля 2009

Я немного озадачен:

  • Из Программирование какао для Mac OS X (стр. 63, 3-е издание, Аарон Хиллегасс): «Если оно достигает вершины дерева [наследования] без поиска метода, функция выдает исключение ".

  • Из статьи Википедии об Objective-C : «объекту, на который направлено сообщение (называемому получателем), не гарантируется, что он ответит на сообщение, и если он не просто игнорирует это и возвращает нулевой указатель. "

Какой это?

Ответы [ 3 ]

7 голосов
/ 09 июля 2009

Если селектор не найден, он перейдет к - [NSObject doesNotRecognizeSelector:]. Реализация по умолчанию запускает исключение.

4 голосов
/ 09 июля 2009

Они оба более или менее правильные. Разница в том, что структура Какао определяет корневые объекты (например, NSObject), от которых наследуются другие классы в структуре; если объект не отвечает на сообщение, по умолчанию ему передается по дереву, пока он не достигнет корневого объекта, который затем вызывает исключение в Какао.

Это поведение можно изменить, чтобы объекты могли выполнять другие действия с сообщениями, которые они не понимают.

Другие платформы Objective C могут по-другому работать с нераспознанными сообщениями (например, возвращая нулевой указатель).

3 голосов
/ 09 июля 2009

В случае Какао и NSObject @Tom является правильным - возникает исключение. При программировании на Какао, сначала доверяйте экспертам Какао. Статья в Википедии посвящена общему языку и среде исполнения и, возможно, также описывает поведение GNUstep. Поведение «игнорировать и вернуть ноль» больше похоже на то, что происходит, если вы отправляете сообщение на nil. Трудно сказать, смутился ли автор или пытается описать поведение по умолчанию, не относящееся к какао.

@ mipadi также имеет большое преимущество в том, что Objective-C позволяет динамически обрабатывать вызовы нереализованных методов, в том числе перенаправлять их на произвольные объекты. Подробнее см. Методы NSObject -methodSignatureForSelector: и -forwardInvocation:. Если вы хотите динамически предоставлять методы таким образом, стоит обратить внимание и на возможность переопределения -respondsToSelector:. (Все эти методы следует использовать только , если вы понимаете, что они делают, поскольку они сильно влияют на то, как экземпляры вашего класса взаимодействуют со средой выполнения Objective-C, и могут иметь непредвиденные результаты.)

Обратите внимание, что контракт для -doesNotRecognizeSelector: требует, чтобы в случае переопределения новая реализация должна вызвать в конце исключение NSInvalidArgumentException.


Редактировать: @Nikolai указал на удивительную запись в блоге Майка Эша , которая "еще глубже рассказывает о том, что происходит, когда среда выполнения не находит соответствующий селектор". Это определенно стоит прочитать. Я не знал об этом посте - спасибо, Николай!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...