Является ли objc_msgSend () значительным элементом, который делает объектно-ориентированный объектно-ориентированный объект ориентированным? - PullRequest
8 голосов
/ 02 декабря 2009

Читая документацию, мне интересно, действительно ли objc_msgSend () является «базовой технологией» в предоставлении функциональности для создания объектно-ориентированного Objective-C. Может быть, кто-то может объяснить более подробно, какие другие части используются для включения объектно-ориентированной парадигмы Objective-C?

Ответы [ 2 ]

10 голосов
/ 03 декабря 2009

Не совсем.

Objective-C является объектно-ориентированным исключительно потому, что он инкапсулирует данные и функциональные возможности в один контейнер; класс.

Это почти все, что нужно для "объектно-ориентированного программирования".

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

В статически распределенном языке - C ++ - лучший пример (да, я знаю, что у него есть виртуальные методы, которые принимают форму динамической диспетчеризации) - вызов метода связан во время компиляции и не может изменяться во время выполнения. То есть реализация метода, который будет использоваться для выполнения вызова метода, фиксируется во время компиляции и не может изменяться во время выполнения.

В динамически отправляемом языке, таком как Objective-C, реализация метода, который будет использоваться для выполнения вызова метода, определяется каждый раз, когда происходит вызов метода. Таким образом, с помощью использования категорий или API-интерфейса среды выполнения можно изменить реализацию метода во время работы приложения (например, именно так работает Key Value Observation).

objc_msgSend() - это крюк, который выполняет динамическую отправку. Он берет ссылку на объект или класс и имя метода - селектор или SEL, как он называется - и ищет реализацию объекта или класса, который идет по этому имени метода. Как только реализация найдена, она вызывается.

Если реализация не найдена, objc_msgSend() предпримет серию шагов, чтобы увидеть, хочет ли класс или экземпляр обработать нераспознанный вызов метода, позволяя одному объекту заменять другой (проксирование) или подобную функциональность.

Это намного больше, чем это. Я бы посоветовал вам прочитать документацию Apple для получения дополнительной информации .

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