Что означает ошибка "непризнанный селектор, отправленный в экземпляр" в 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". Я добавил его, и все было исправлено.