Как узнать, существует ли метод в Obj-C, когда ему дана строка NSString - PullRequest
3 голосов
/ 04 мая 2010

У меня есть метод как NSString *. Если он существует, я хочу позвонить, а если нет, ничего не делать.

SEL eventSelector = NSSelectorFromString(eventSelectorStr);
if ([delegate respondsToSelector:eventSelector]) {
    [delegate performSelector:eventSelector];
    [delegate adapterDidFinishAdRequest:self];
}
else {
    // Does not implement selector
}

Этот код не работает, так как NSSelectorFromString зарегистрирует строку как селектор, поэтому respondsToSelector:eventSelector вызовет сбой, потому что селектор действительно недействителен.

Ответы [ 4 ]

5 голосов
/ 04 мая 2010

Почему вы говорите, что это не работает? Это наиболее распространенный способ реализации вызова дополнительных методов делегата. У меня никогда не было проблем с тем, что эта конструкция не работает.

1 голос
/ 04 мая 2010

Давайте проясним некоторую путаницу.

NSSelectorFromString() сгенерирует допустимый селектор из строки и не потерпит крах при этом. respondsToSelector: будет правильно определять, реализует ли этот метод этот метод, без сбоев. Это правда, что если вы вызываете executeSelector: с селектором, который делегат не реализует, это вызовет сбой.

Однако, здесь не та ситуация. Код действителен. Если у вас произошел сбой в этом коде, я бы проверил сообщение об ошибке и вместо этого посмотрел на adapterDidFinishAdRequest:.

0 голосов
/ 06 мая 2010

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

Вот раздел о возвращаемом значении для NSSelectorFromString() из документации Apple:

Возвращаемое значение

Селектор, названный aSelectorName . Если aSelectorName равно nil или не может быть преобразован в UTF-8 (это должно быть только из-за недостатка памяти), возвращает (SEL)0.

Внимательное прочтение показывает, что only ситуации, которые могут привести к возвращению (SEL)0, это если ваша строка была nil или вам не хватило памяти.

0 голосов
/ 04 мая 2010

Попробуйте проверить eventSelector != nil перед его использованием.

...