В чем разница между методом и селектором?

Какая разница между методом, селектором и сообщением в Objective-C?

Это большой вопрос.

  • Селектор – селектор – это имя метода. Вы хорошо знакомы с этими селекторами: alloc , init , release , dictionaryWithObjectsAndKeys: setObject:forKey: и т. Д. Обратите внимание, что двоеточие является частью селектора; это то, как мы идентифицируем, что этот метод требует параметров. Также (хотя это очень редко), у вас могут быть такие селектора: doFoo::: . Это метод, который принимает три параметра, и вы вызываете его как [someObject doFoo:arg1 :arg2 :arg3] . Нет требования, чтобы перед каждой частью компонентов селектора были буквы. Как я уже сказал, это крайне редко, и вы не найдете его в каркасах Cocoa. Вы можете работать с селекторами непосредственно в Cocoa. Они имеют тип SEL : SEL aSelector = @selector(doSomething:) или SEL aSelector = NSSelectorFromString(@"doSomething:");

  • Сообщение. Сообщение – это селектор и аргументы, которые вы отправляете вместе с ним. Если я скажу [dictionary setObject:obj forKey:key] , то «сообщение» – это селектор setObject:forKey: плюс аргументы obj и key . Сообщения могут быть инкапсулированы в объект NSInvocation для последующего вызова. Сообщения отправляются получателю . (т. е. объект, который «получает» сообщение).

  • Метод – метод представляет собой комбинацию селектора и реализации (и сопутствующих метаданных). «Реализация» – это фактический блок кода; это указатель на функцию ( IMP ). Фактический метод можно получить внутренне, используя структуру Method (извлекаемую из среды выполнения).


Некоторые другие связанные вещи, о которых вы не просили:

  • Подпись метода – подпись метода представляет типы данных, возвращаемые и принимаемые методом. Они могут быть представлены во время выполнения через NSMethodSignature и (в некоторых случаях) raw char* .

  • Реализация – фактический исполняемый код метода. Его тип во время выполнения – это IMP , и это действительно просто указатель на функцию. iOS 4.3 включает новую возможность превратить блок в IMP . Это действительно здорово .

Одна из интересных вещей, которую нужно реализовать, – это то, что имя метода (селектор) отличается от реализации метода (IMP). Это означает, что вы можете поменять их, если вы чувствуете смелость. Вы также можете добавлять и удалять методы во время выполнения, потому что все, что вы делаете, редактирует запись в хеш-таблице: ключ является селектором, а значение – IMP метода. Это позволяет вам делать действительно сумасшедшие и странные вещи. Это не для слабонервных. 🙂

Метод – это реализация, выполняемая, когда объекту или classу предлагается выполнить какое-либо действие. Он входит в сферу его содержащего classа и поэтому отличается при ссылке через какой-либо другой class. Селектор – это идентификатор, который представляет имя метода. Он не связан с каким-либо конкретным classом или методом и может использоваться для описания метода любого classа, будь то метод classа или экземпляра.

Просто селектор походит на ключ в словаре. Он может рассказать вам, о каком методе кто-то говорит, но только если у вас также есть словарь (class или объект). Метод – это то, что вы получаете, когда вы запрашиваете значение из словаря, используя селектор в качестве ключа.

Этот сайт имеет хороший обзор всей терминологии, о которой идет речь: http://www.otierney.net/objective-c.html

Проверьте ссылку, но я дам краткое резюме:

Метод по существу подобен методу функции, к которому вы привыкли на своем любимом языке программирования.

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

Селекторы могут означать две вещи. Он может ссылаться на имя метода или «ссылается на уникальный идентификатор, который заменяет имя при компиляции исходного кода. Скомпилированные селекторы имеют тип SEL». (от: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocSelectors.html )

  • Получить тип файла в Cocoa
  • Objective C - цикл для изменения текста метки
  • Тестирование нуля в Objective-C - if (x! = Nil) vs if (x)
  • Interesting Posts

    xmlns, xmlns: xsi, xsi: schemaLocation и targetNamespace?

    Библиотека не загружена: ошибка libmysqlclient.16.dylib при попытке запустить «сервер rails» на OS X 10.6 с помощью mysql2 gem

    Как вы храните в памяти сколь угодно большое целочисленное значение?

    Загрузка DLL-файлов во время выполнения в C #

    ESP8266 NodeMCU Запуск из памяти кучи

    CSV для сопоставления объектной модели

    Только мой компьютер не подключается к определенному IP-адресу

    Лучший способ избежать невидимости публичного участника и разрастания / повторения исходного кода с унаследованными шаблонами classов?

    Как отображать частоту в верхней части каждого фактора в штриховом шрифте в R

    Обнаружение события JTextField «отменить выбор»

    Общая информация AssemblyInfo для единообразного управления версиями в решении

    Обновление до Windows 10 с Windows Vista Home

    Установка Java на OS X 10.9 (Mavericks)

    В чем разница между динамическим и статическим polymorphismом в Java?

    Переподготовка после проверки креста с помощью libsvm

    Давайте будем гением компьютера.