Что означает ошибка "непризнанный селектор, отправленный в экземпляр" в Xcode
Что означает "unrecognized selector sent to instance"
в Xcode
?
Ответы
Ответ 1
Это означает, что метод не определен или на другом пути, вызывая метод на неправильном объекте.
Классический пример этой ошибки отсутствует в ':' при вызове селектора.
UIBarButtonItem *doneBtn = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self
action:@selector(DatePickerDoneClick)];
Здесь
action:@selector(DatePickerDoneClick:)
а не
action:@selector(DatePickerDoneClick)
Ответ 2
В моем случае это означает, что я не понял (за два дня) очень простое требование обработчика (селектор, функция):
Я отключил... : (NSNotification *) уведомление... в моем селекторе (функции).
В конце концов, это просто самоубийство. (или программирование устало, пытаясь понять новое в iOS/xCode). Я читал документы в яблоке, я читал много, много здесь, в stackoverflow и читал все другие страницы из результатов поиска и просто продолжал игнорировать тот факт, что у меня было:
в viewDidLoad:
[[NSNotificationCenter defaultCenter] addOberserver:self selector:@selector(myHandler:) name:@"UIApplicationWillResignActiveNotification" object:nil];
в .h(декларации) и .m(действительный код), я изобрел:
-(void)myHandler { ... }
Это вызвало нераспознанный селектор, отправленный экземпляру (аварийный и отладочный вывод) во время выполнения (без ошибок или предупреждений в xcode). Затем я провел почти два целых дня, пытаясь выяснить ошибку, и ошибка была:
-(void)myHandler:(NSNotification*)notification { ... }
Надеюсь, что это поможет кому-то еще застрять - это синтаксис (ваш селектор или обработчик или функция или все, что вы хотите называть) должен взять объект (NSNotification *) в качестве параметра пользуетесь им это или нет; и xcode (4.2 w/iOs SDK 5.0) не генерирует никаких ошибок или предупреждений об этой "ошибке".
Ответ 3
Это означает, что вы вызывали метод для объекта, который не поддерживает этот метод.
Причина, по которой он говорит "непризнанный селектор", заключается в том, что вызов метода реализуется механизмом отправки сообщений. Часть сообщения, содержащего имя метода, называется селектором.
Ответ 4
Если вы удалили и заново создали кнопки на раскадровке, у вас может быть кнопка, связанная с двумя разными способами: старая (удаленная) и новая. Это случалось со мной много раз.
Чтобы исправить:
1) В XCode/IB просмотрите раскадровку.
2) Нажмите кнопку, вызывающую исключение.
3) На правой правой панели щелкните значок "Коннектор". (Круг с стрелкой в нем, по состоянию на апрель 2015 года).
4) Предполагая, что вы ссылаетесь на действие "Touch Up Inside", убедитесь, что только один метод связан. Рядом с каждым будет отображаться [x], поэтому, если их две, убейте ту, которая больше не существует.
Ответ 5
Я думаю, что эта ошибка вызвана вызовом функции в классе, которая не объявлена в классе.
Ответ 6
Я думаю, что когда вы вызываете селектор на экземпляр метода, который не принадлежит этому экземпляру.
возможно, я ошибаюсь, я не уверен, прошло некоторое время, так как я закодировал что-нибудь в xcode.
Ответ 7
Для меня было просто Xcode
не потрудиться скомпилировать код. Apple, очевидно, не считает, что разработка iOS достаточно сложна, поэтому им приходится создавать дополнительную flakiness в среде IDE.
Мне сказали, что SHIFT+COMMAND+K
для очистки сборки может быть большой помощью.
Ответ 8
Я получил эту ошибку из-за того, что не присвоил пользовательский класс представлению в построителе интерфейса.
NSArray *subviewArray = [[NSBundle mainBundle] loadNibNamed:@"EventsFilterView" owner:self options:nil];
self.filters = [subviewArray objectAtIndex:0];
Переменная self.filters
была назначена классу EventFilterView
, но фактический вид в файле xib не был.
Надеюсь, это поможет кому-то.
Ответ 9
Есть несколько причин, почему это может произойти:
ONE: метод объявлен в .h, но не существует в .m. Компилятор не жалуется, но во время выполнения вы сталкиваетесь с этим сбоем. Пожалуйста, проверьте это:
- Метод реализуется в m.
- Подпись метода точно такая же.
- В конце подписи метода нет полуколонии.
TWO: Если вы вызываете делегированный метод, проверьте, действительно ли этот метод реализован.
Я использую эту ошибку при изменении подписи, но я забыл обновить метод подписи в файле реализации .m
Ответ 10
У меня была аналогичная проблема, и проблема заключалась в том, что мой класс ".m", содержащий неизвестный селектор, не был включен в список "Build Phases/Compile Sources".
Я добавил его, и все было исправлено.