Ответ 1
Это отличный вопрос.
-
Селектор. Селектор - это имя метода. Вы знакомы с этими селекторами:
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
для последующего вызова. Сообщения отправляются получателю. (т.е. объект, который "получает" сообщение). -
Метод - метод представляет собой комбинацию селектора и реализации (и сопутствующих метаданных). "Реализация" - это фактический блок кода; это указатель на функцию (a
IMP
). Фактический метод может быть извлечен изнутри с помощью структурыMethod
(извлекаемой из среды выполнения).
Некоторые другие связанные вещи, о которых вы не просили:
-
Подпись метода - подпись метода представляет типы данных, возвращаемые и принятые методом. Они могут быть представлены во время выполнения через
NSMethodSignature
и (в некоторых случаях) rawchar*
. -
Реализация - фактический исполняемый код метода. Его тип во время выполнения -
IMP
, и это действительно просто указатель на функцию. iOS 4.3 включает новую возможность превратить блок вIMP
. Это действительно здорово.
Одна из интересных вещей, которую нужно реализовать, - это то, что имя метода (селектор) отличается от реализации метода (IMP). Это означает, что вы можете поменять их, если вы чувствуете смелость. Вы также можете добавлять и удалять методы во время выполнения, потому что все, что вы делаете, редактирует запись в хеш-таблице: ключ является селектором, а значение - IMP
метода. Это позволяет вам делать действительно сумасшедшие и странные вещи. Это не для слабонервных.:)