В чем разница между методом и селектором? - PullRequest
78 голосов
/ 10 апреля 2011

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

Ответы [ 3 ]

138 голосов
/ 10 апреля 2011

Это отличный вопрос.

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

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

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


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

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

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

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

9 голосов
/ 10 апреля 2011

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

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

1 голос
/ 10 апреля 2011

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

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

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

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

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

...