Я хочу использовать селектор на экземпляре NSObject без необходимости реализации протокола. Например, есть метод категории, который должен установить свойство ошибки, если экземпляр NSObject, к которому он вызывается, поддерживает его. Это код, и код работает как задумано:
if ([self respondsToSelector:@selector(setError:)])
{
[self performSelector:@selector(setError:) withObject:[NSError errorWithDomain:@"SomeDomain" code:1 userInfo:nil]];
}
Однако компилятор не видит никакого метода с setError: signature, поэтому он выдает предупреждение для каждой строки, содержащей @selector(setError:)
фрагмент:
Undeclared selector 'setError:'
Я не хочу объявлять протокол, чтобы избавиться от этого предупреждения, потому что я не хочу, чтобы все классы могли использовать это для реализации чего-то особенного. Я просто хочу, чтобы у них был setError:
метод или свойство.
Это выполнимо? Как?
Приветствия,
EP
objective-c
selector
categories
epologee
источник
источник
Ответы:
Другим вариантом будет отключить предупреждение с помощью:
Вы можете поместить эту строку в файл .m, где появляется предупреждение.
Обновить:
Это также работает с LLVM:
источник
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wundeclared-selector"
// Do your thing
#pragma clang diagnostic pop
#pragma clang diagnostic ignored "-Wselector"
Посмотрите на NSSelectorFromString .
Это позволит вам создавать селектор во время выполнения, а не во время компиляции по
@selector
ключевому слову, и у компилятора не будет никаких претензий.источник
sel_registerName()
Thingy выглядит затенять и вид , вы не должны называть напрямую , если вы не знаете , что вы делаете, вроде как obj_msg_send ();)Я думаю, что это потому, что по какой-то странной причине селектор не зарегистрирован во время выполнения.
Попробуйте зарегистрировать селектор через
sel_registerName()
:источник
NSSelectorFromString
звонитsel_registerName()
под капот. Выберите тот, который подходит вам лучше.sel_registerName()
напрямую объясняют, почему вы это делаете.NSSelectorFromString
не говорит вам, что попытается зарегистрировать селектор.Я получил это сообщение, чтобы уйти # включив файл методом. Из этого файла больше ничего не использовалось.
источник
Я понимаю, что немного опаздываю к этой теме, но для полноты вы можете отключить это предупреждение глобально, используя настройки целевой сборки.
В разделе «Предупреждения Apple LLVM - Objective-C» изменить:
источник
Если ваш класс реализует метод setError: (даже объявив динамически установщик свойства возможной ошибки), вы можете объявить его в файле интерфейса (.h) или если вам не нравится показывать его таким образом, вы могли бы попробуйте хитрый трюк с PrivateMethods:
как раз перед вашим @implementation, это должно скрывать предупреждения;).
источник
PerformSelector may cause a leak because its selector is unknown
Действительно удобный макрос для вставки в ваш
.pch
илиCommon.h
или где вы хотите:Это редактирование этого вопроса для аналогичного вопроса ...
источник
Вы можете отключить его в Xcode, как на скриншоте:
источник
Вы также можете сначала привести рассматриваемый объект к идентификатору, чтобы избежать предупреждения:
источник
Другой способ избежать этого предупреждения - убедиться, что ваш метод выбора выглядит так:
Не забудьте "(id) отправителя", если вы хотите принять любого отправителя или указать тип объекта отправителя, если вы предпочитаете.
источник
Хотя правильный ответ, вероятно, заключается в информировании XCode посредством импорта или регистрации селектора о том, что такой селектор существует, в моем случае мне не хватало точки с запятой. Прежде чем «исправить» ошибку, убедитесь, что, возможно, ошибка правильная, а ваш код - нет. Например, я обнаружил ошибку в образце Apple MVCNetworking.
источник
Мне удалось убрать предупреждение, добавив ничтожный метод (раскрытие: я не задумывался об этом, но нашел его, прибегнув к поиску по расписанию по расписанию с интервалом времени)
Хотя я ценю знание того, как скрыть предупреждение, лучше исправить его, и ни методы Серхио, ни Релкина не помогли мне по неизвестным причинам.
источник