В Objective C у вас есть концепция отправки сообщений другим объектам, и это очень похоже на вызов методов в таких языках, как C # и Java.
Но какие именно тонкие различия? Как я должен думать об обмене сообщениями, думая о моем коде?
Примечание: здесь я немного разбираюсь, я разработчик на C # / Java и пытаюсь понять некоторые концепции Objective C.
Ответы:
Сообщение - это имя селектора и параметры этого селектора.
Селектор это символ.
Метод - это фрагмент кода в классе, идентифицируемый селектором.
Другими словами,
[foo bar: baz]
говорится «отправить сообщение, вызванное@selector(bar:)
с параметром,baz
к объектуfoo
. Вы можете отправить это сообщение множеству различных объектов.Напротив, метод
bar:
дляFoo
может выглядетьно
FooTwo
может выглядеть(Я надеюсь, что у меня есть правильный синтаксис; прошло много времени с тех пор, как я последний раз касался Objective-C.)
Когда вы отправляете сообщение, ядро Objective C отправляет сообщение,
foo
которое решает, понимает ли оно сообщение. Он решает это на основе того, может ли он найти метод, идентифицированный этим селектором.Два метода с одинаковым именем и одно сообщение.
Для объекта также возможно просто переслать определенное сообщение (или набор сообщений) другому объекту для обработки. В этом случае вы отправляете сообщение этому прокси-объекту, у которого нет методов для сопоставления с этим сообщением , и прокси-сервер пересылает сообщение в свой обернутый объект.
источник
С чисто теоретической точки зрения нет никакой разницы между этими двумя понятиями - существует целый ряд формальных доказательств, показывающих, что эти два понятия полностью эквивалентны, и любое из них может быть полностью реализовано в терминах другого.
С несколько меньшей теоретической точки зрения есть одно возможное отличие: в типичной реализации таблица виртуальных функций распределяется статически, а содержимое каждой таблицы фиксируется во время компиляции. В отличие от этого, поиск сообщений обычно выполняется с помощью какого-либо объекта, подобного карте, который обычно является динамическим, то есть вы можете изменить его во время выполнения. Это позволяет относительно легко добавить новый ответ к сообщению в существующем классе. К сожалению, в большинстве случаев это остается в основном теоретическим. Во- первых, вы в основном имеем дело с самомодифицирующимся кода, который большинство людей решили было довольно неплохо долгодавно. Во-вторых, чтобы сделать его очень значимым, вам нужно иметь возможность скомпилировать новый код в существующий класс для ответа на новое сообщение, которое вы поддерживаете. Без этого все, что вы получаете, - это возможность динамически добавлять новое имя для существующего метода.
Как следует из конца предыдущего абзаца, с действительно практической точки зрения, между этими двумя понятиями очень мало различий. Это просто два (очень немного) разных способа поддержки позднего связывания. Хотя поиск на основе сообщений, как правило, немного медленнее, было бы довольно необычно, если бы разница была действительно значительной. Для большинства практических целей это всего лишь два разных способа достижения одной и той же цели.
источник
В Objective-C сообщения имеют позднюю привязку. То есть они разрешаются во время выполнения. C # поддерживает аналогичную конструкцию через ключевое слово Dynamic, которое также объявляет объект с поздним связыванием.
источник
Обычно вызовы методов разрешаются во время компиляции (если вы не используете отражение в Java), тогда как сообщения в Objective C отправляются во время выполнения.
источник
struct
качестве первого параметра. Позднее связывание является неотъемлемой частью полиморфизма и, следовательно, ООП.Сообщения обрабатываются либо ядром, либо самим языком (например, для ObjC существует очень маленький ассемблерный код).
Например, в ядре Linux сообщения обрабатываются с помощью системных вызовов / функций: вы можете узнать о них, если будете искать в системном программировании Unix.
Основное различие между вызовом метода и сообщением заключается в следующем:
вызов метода происходит только в вашем коде: в ASM он переводится PUSH переданных аргументов.
сообщение ядра - это в основном то, что отправляется в ядро, которое отслеживается и отправляется обратно определенным процессам. Я могу ошибочно принять их за каналы, но что угодно: знайте, что уже существует механизм, который позволяет вам запускать несколько программ одновременно и позволять общаться одновременно. Конечно, не надейтесь, что это будет работать так же на Windows или других ОС.
источник