Яка різниця між методом, селектором та повідомленням у Objective-C?
Яка різниця між методом, селектором та повідомленням у Objective-C?
Відповіді:
Це чудове питання.
Селектор - селектор - це назва методу. Ви добре знайомі з цими селекторами: alloc
, init
, release
, dictionaryWithObjectsAndKeys:
, setObject:forKey:
і т.д. Зверніть увагу , що двокрапка є частиною селектора; ми визначаємо, що для цього методу потрібні параметри. Крім того (хоча це вкрай рідко), ви можете мати селектори , як це: doFoo:::
. Це метод, який приймає три параметри, і ви б викликали його як [someObject doFoo:arg1 :arg2 :arg3]
. Немає вимоги, щоб перед кожною частиною компонентів селектора були літери. Як я вже говорив, це надзвичайно рідко, і ви не знайдете, щоб він використовувався в рамках какао. Ви можете працювати з селекторами безпосередньо в Какао. Вони мають тип SEL
: SEL aSelector = @selector(doSomething:)
абоSEL aSelector = NSSelectorFromString(@"doSomething:");
Повідомлення - повідомлення є засобом вибору та аргументами, які ви надсилаєте з ним. Якщо я скажу [dictionary setObject:obj forKey:key]
, тоді "повідомлення" - це селектор setObject:forKey:
плюс аргументи obj
та key
. Повідомлення можуть бути інкапсульовані в NSInvocation
об'єкт для подальшого виклику. Повідомлення надсилаються одержувачу . (тобто об’єкт, який «отримує» повідомлення).
Метод - метод є комбінацією селектора та реалізації (та супутніх метаданих). "Реалізація" - це власне блок коду; це покажчик функції (an IMP
). Фактичний метод можна отримати внутрішньо, використовуючи Method
структуру (доступну для виконання).
Деякі інші пов’язані речі, про які ви не просили:
Підпис методу - підпис методу представляє типи даних, що повертаються та приймаються методом. Вони можуть бути представлені під час виконання за допомогою NSMethodSignature
і (в деяких випадках) сировини char*
.
Реалізація - фактичний виконуваний код методу. Його тип під час виконання - це IMP
, і це насправді лише покажчик функції. iOS 4.3 включає нову можливість перетворення блоку в IMP
. Це справді круто .
Однією з цікавих речей є усвідомлення того, що назва методу (селектор) відрізняється від реалізації методу (IMP). Це означає, що ви можете поміняти їх місцями, якщо ви відчуваєте сміливість. Ви також можете додавати та видаляти методи під час виконання, оскільки все, що ви робите, - це редагування запису в хеш-таблиці: ключ - селектор, а значення - IMP
метод. Це дозволяє вам робити справді божевільні та хитрі речі. Це не для людей зі слабким серцем. :)
if
оператором? Я думаю, це тому, що без if
s наші методи стають більш чистими методами, які виконують те, що їм сказали. Висновок про те, що „обробка стану” та „дія”, яка обертається навколо неї, не повинні бути одним методом.
Метод - це реалізація, яка запускається, коли об’єкту або класу пропонується виконати якусь дію. Він знаходиться в межах свого класу, що містить, і тому відрізняється при посиланні через якийсь інший клас. Селектор - це ідентифікатор, який представляє назву методу. Він не пов'язаний з яким-небудь конкретним класом або методом і може використовуватися для опису методу будь-якого класу, будь то клас або метод екземпляра.
Просто селектор - це як ключ у словнику. Він може сказати вам, про який метод хтось говорить, але лише якщо у вас є сам словник (клас або об’єкт). Метод - це те, що ви отримуєте, коли запитуєте значення зі словника, використовуючи селектор як ключ.
Цей сайт має хороший огляд усієї розглянутої термінології: http://www.otierney.net/objective-c.html
Перевірте посилання, але я дам короткий підсумок:
Метод за своєю суттю схожий на метод функції, до якого ви звикли у вашій улюбленій мові програмування.
Повідомлення (зі статті) "Повідомлення може бути динамічно перенаправлено на інший об'єкт. Виклик повідомлення на об'єкті в Objective-C не означає, що об'єкт реалізує це повідомлення, просто знає, як якось відповісти на нього через безпосередньо впроваджуючи його або пересилаючи повідомлення об’єкту, який знає, як це зробити ".
Селектори можуть означати дві речі. Він може посилатися на назву методу, або "посилається на унікальний ідентифікатор, який замінює ім’я, коли компілюється вихідний код. Скомпільовані селектори мають тип SEL". (з: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocSelectors.html )