Перевірте, чи існує метод


111

Чи є спосіб перевірити, чи існує метод у Objective-C?

Я намагаюся додати охорону, щоб побачити, чи є у мого об'єкта метод, перш ніж викликати його.


Існує також питання, чи це правильний підхід, в першу чергу, оскільки класи Objective-C можуть відповідати селекторам, які вони не заявили (через - forwardInvocation:).
стипендіати доналу

Відповіді:



72

Є також статичні повідомлення екземплярівRespondToSelector: (SEL) Вибірник Ви б назвали це так:

[MyClass instancesRespondToSelector:@selector(someMethod:withParams:)]

або так:

[[myObject class] instancesRespondToSelector:@selector(someMethod:withParams:)]

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


1
Чим відрізняються екземпляриRespondToSelector від respondsToSelector?
CReaTuS

1
Основна відмінність полягає в тому, що одне - це повідомлення про екземпляр (для перевірки наявності визначеного повідомлення про екземпляр), а інше - повідомлення класу (для перевірки, чи існує визначене повідомлення класу).
Рікард Перес дель Кампо

1
+1 для [екземплярів MyClassRespondToSelector]. Мені це знадобилося всередині методу створення init: Коли підкласифікація, можливо, потрібно викликати один суперінітальний метод замість інших (застарілих), оскільки self ще не створений, і responseToSelector завжди повертатиме NO.
LightMan

12

Використовуйте respondsToSelector:. З документації :

respoToSelector:

Повертає булеве значення, яке вказує, реалізує чи успадковує приймач метод, який може відповісти на вказане повідомлення.

- (BOOL)respondsToSelector:(SEL)aSelector

Параметри
aSelector - селектор, який ідентифікує повідомлення.

Повернене значення,
YES якщо приймач реалізує або успадковує метод, який може відповісти на aSelector , в іншому випадку NO.


10

Ви шукаєте відповідіToSelector: -

if ([foo respondsToSelector: @selector(bar)] {
  [foo bar];
}

Як говорить Дональ, вище сказане вам говорить, що foo може точно впоратися з отриманням селектора бруска. Однак, якщо foo - це проксі-сервер, який пересилає смужку до якогось основного об'єкта, який отримає смугове повідомлення, тоді responseToSelector: скаже вам "НІ", навіть якщо повідомлення буде перенаправлено об'єкту, який відповідає на бар.


1

Перевірка селекторів respondsToSelector, як правило, лише для делегатних методів. Ви не повинні використовувати forwardInvocation або проксі-сервери для делегатних методів. Якщо вам потрібно використовувати respondsToSelector в інших ситуаціях, ви можете переконатися, що немає більш підходящого способу розробки вашої програми.

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