Что означает ошибка «нераспознанный селектор, отправленный экземпляру» в Xcode - PullRequest
15 голосов
/ 28 марта 2011

Что это значит "unrecognized selector sent to instance" в Xcode?

Ответы [ 10 ]

17 голосов
/ 17 декабря 2011

Это означает, что метод не определен или, наоборот, вызывает метод для неправильного объекта.

классический пример этой ошибки - отсутствие символа ":" в вызове селектора.

UIBarButtonItem *doneBtn = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self
                action:@selector(DatePickerDoneClick)];

Здесь ожидается

action:@selector(DatePickerDoneClick:)

вместо

action:@selector(DatePickerDoneClick)
6 голосов
/ 18 апреля 2015

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

Исправить: 1) В XCode / IB просмотрите раскадровку.2) Нажмите на кнопку, которая вызывает исключение.3) На правой панели нажмите значок «Разъем».(Кружок со стрелкой на апрель 2015 г.)4) Предполагая, что вы связываетесь с действием «Touch Up Inside», убедитесь, что связан только ОДИН метод.[X] появится рядом с каждым, поэтому, если их два, убейте того, которого больше не существует.

6 голосов
/ 14 марта 2012

В моем случае это означает, что я не понял (в течение двух дней) очень простое требование обработчика (селектор, функция): я прекратил ... :( NSNotification *) уведомление ... в моем селекторе (функция).

В конце концов, это просто self.stupidMistake (или программирование устало при попытке понять что-то новое в iOs / xCode).Я прочитал документы в Apple, я прочитал много, много здесь, в 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) не генерирует ошибок или предупреждений об этой «ошибке».

5 голосов
/ 28 марта 2011

Это означает, что вы вызвали метод для объекта, который не поддерживает этот метод.

Причина, по которой он говорит «нераспознанный селектор», заключается в том, что вызов метода реализуется механизмом отправки сообщений. Часть сообщения, содержащая имя метода, называется селектором.

4 голосов
/ 28 марта 2011

Я думаю, что эта ошибка связана с вызовом функции в классе, которая не объявлена ​​в классе.

2 голосов
/ 28 марта 2011

Я думаю, это когда вы вызываете селектор для экземпляра метода, который не принадлежит этому экземпляру. может быть, я ошибаюсь, я не уверен, я давно уже ничего не кодировал в xcode.

1 голос
/ 24 января 2013

Для меня было просто Xcode не потрудиться скомпилировать код.Apple, очевидно, не думает, что разработка iOS достаточно сложна, поэтому им приходится встраивать дополнительные возможности в IDE.

Мне сказали, что SHIFT+COMMAND+K для очистки сборки может быть очень полезным.

0 голосов
/ 06 марта 2015

У меня была похожая проблема, и проблема заключалась в том, что мой класс .m, содержащий неизвестный селектор, отсутствовал в списке «Этапы сборки / источники компиляции». Я добавил это, и все было исправлено.

0 голосов
/ 15 января 2015

Существует несколько причин, по которым это может произойти:

ONE: метод объявлен в .h, но не существует в .m. Компилятор не жалуется, но во время выполнения вы сталкиваетесь с этим сбоем. Пожалуйста, проверьте это:

  1. Способ реализован в м.
  2. Подпись метода точно такая же.
  3. В конце сигнатуры метода нет точки с запятой.

ДВА: Если вы вызываете делегированный метод, проверьте, действительно ли этот метод реализован.

Я использую эту ошибку при изменении подписи, но я забыл обновить метод подписи в файле реализации .m

0 голосов
/ 29 августа 2013

Я получил эту ошибку из-за того, что пользовательский класс не был назначен представлению в Интерфейсном Разработчике.

 NSArray *subviewArray = [[NSBundle mainBundle] loadNibNamed:@"EventsFilterView" owner:self options:nil];
 self.filters = [subviewArray objectAtIndex:0];

Переменная self.filters была назначена классу EventFilterView, но фактическое представление в файле xib не было.

Надеюсь, это кому-нибудь поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...