У чому різниця між методом і селектором?


Відповіді:


142

Це чудове питання.

  • Селектор - селектор - це назва методу. Ви добре знайомі з цими селекторами: 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метод. Це дозволяє вам робити справді божевільні та хитрі речі. Це не для людей зі слабким серцем. :)


Це чудова відповідь: D 1. отже, селектор більше схожий на підпис / шлях до самого методу? Повідомте компілятору, що це так ви знайдете? 2. Я вважаю, що це ефективніше, ніж передача самого методу. Правда? 3. Оскільки кожен селектор і метод мають співвідношення 1: 1, і завдяки цій ефективності саме тому ви не проходите метод. 4. Також ви можете навести безглуздий приклад. Ви також можете додавати та видаляти методи під час виконання. Я завжди про це чув, але ніколи не мав потреби робити це, і не бачив цього, я думаю .
Мед

5а. Це те, що я можу передати умовний параметр, який перемикається між селекторами? 5б. замість передачі умовного параметра селектору ... чому б просто не створити один метод із ifоператором? Я думаю, це тому, що без ifs наші методи стають більш чистими методами, які виконують те, що їм сказали. Висновок про те, що „обробка стану” та „дія”, яка обертається навколо неї, не повинні бути одним методом.
Мед

9

Метод - це реалізація, яка запускається, коли об’єкту або класу пропонується виконати якусь дію. Він знаходиться в межах свого класу, що містить, і тому відрізняється при посиланні через якийсь інший клас. Селектор - це ідентифікатор, який представляє назву методу. Він не пов'язаний з яким-небудь конкретним класом або методом і може використовуватися для опису методу будь-якого класу, будь то клас або метод екземпляра.

Просто селектор - це як ключ у словнику. Він може сказати вам, про який метод хтось говорить, але лише якщо у вас є сам словник (клас або об’єкт). Метод - це те, що ви отримуєте, коли запитуєте значення зі словника, використовуючи селектор як ключ.


1

Цей сайт має хороший огляд усієї розглянутої термінології: http://www.otierney.net/objective-c.html

Перевірте посилання, але я дам короткий підсумок:

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

Повідомлення (зі статті) "Повідомлення може бути динамічно перенаправлено на інший об'єкт. Виклик повідомлення на об'єкті в Objective-C не означає, що об'єкт реалізує це повідомлення, просто знає, як якось відповісти на нього через безпосередньо впроваджуючи його або пересилаючи повідомлення об’єкту, який знає, як це зробити ".

Селектори можуть означати дві речі. Він може посилатися на назву методу, або "посилається на унікальний ідентифікатор, який замінює ім’я, коли компілюється вихідний код. Скомпільовані селектори мають тип SEL". (з: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocSelectors.html )

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.