`неопознанный селектор отправлен в экземпляр ‹OBJ_ADR›` после отправки `dismissViewControllerAnimated: Завершение` в UIViewController

Множество подобных вопросов, но без решения, которое работает в моем случае.


Я пытаюсь написать простой FlipSideApp. Всего два представления с одной кнопкой каждое (flipBtn | flopBtn) для представления другого представления наоборот. flip при первом просмотре работает нормально. flop с другой стороны вызывает
unrecognized selector sent to instance 0x6c3adf0.

Приложение аварийно завершает работу после вызова [self dismissViewControllerAnimated:YES completion:nil]; в файле FlipSide.m (см. Код ниже). Где 0x6c3adf0 - текущий адрес self, который в этом случае является экземпляром FlipSide : UIViewController.

Поэтому я думаю, что нераспознанный селектор, упомянутый в сообщении об ошибке, - это dismissViewControllerAnimated:completion-method.
При вводе Xcode CodeSense «рекомендует» этот метод.

Согласно Справочнику по классу UIViewController этот метод известен в SDK iOS 5.0.
Моя цель развертывания - 5.0, устройство iPhone, базовый SDK iOS 5.0, стандарт архитектуры (arm7).

Если для всех исключений установлена ​​символическая точка останова, отладчик останавливается на UIApplicationMain в основной функции. Ничего подобного.
Зомби-объекты включены. Даже когда я думаю, что проблема не в утечках памяти.

Что я могу сделать, чтобы селектор распознавался?



Файл: "AppDelegate.m"

#import "FirstViewController.h"

- (BOOL)application:(UIApplication *)application  
                  didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  

self.window = [[[UIWindow alloc]  
                      initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

// Override point for customization after application launch.
UIViewController *viewController1 = [[[FirstViewController alloc]  
                 initWithNibName:@"FirstViewController" bundle:nil] autorelease];

self.window.rootViewController = viewController1;
[self.window makeKeyAndVisible];
return YES;
}




Файл: "FirstViewController.h"

@interface FirstViewController : UIViewController

- (IBAction)flipBtn:(id)sender;

@end


Файл: "FirstViewController.m"

…
- (IBAction)flipBtn:(id)sender {

NSLog(@"%s -- reached --", __PRETTY_FUNCTION__);

FlipSide* flipSide = [[FlipSide alloc] initWithNibName:@"FLipSide" bundle:nil];
[self presentViewController:flipSide animated:YES completion:nil];    

NSLog(@"%s -- done --", __PRETTY_FUNCTION__);
}




Файл: "FlipSide.h"

@interface FlipSide : UIViewController 

- (IBAction)flopBtn:(id)sender;

@end


Файл: "FlipSide.m"

#import "FlipSide.h"

- (IBAction)flopBtn:(id)sender {

NSLog(@"%s -- reached --", __PRETTY_FUNCTION__);

NSLog(@"self address is: %@", self);

//  //  //      ??? unrecognized selector sent to instance ???
[self dismissViewControllerAnimated:YES completion:nil]; //  <--

NSLog(@"%s -- done --", __PRETTY_FUNCTION__);
}




Консоль OutPut - это:

-[FirstViewController flipBtn:] -- reached --
-[FirstViewController flipBtn:] -- done --
-[FLipSide flopBtn:] -- reached --
self address is: <FLipSide 0x6c3adf0>
-[FLipSide flopBtn:] -- done --
-[FLipSide flopBtn:]: unrecognized selector sent to instance 0x6c3adf0 

person noone    schedule 11.12.2011    source источник
comment
Попробуйте вместо этого [self.navigationController dismissView...]. Я столкнулся со странными проблемами с памятью, если вы вызываете его в UIViewController вместо UINavigationController.   -  person Craig Otis    schedule 12.12.2011
comment
Мне жаль, что это не помогает. Мое приложение по-прежнему вылетает с тем же сообщением об ошибке   -  person noone    schedule 12.12.2011
comment
Я немного поэкспериментировал и кое-что выяснил: (1) Я снова реализовал точно такой же проект с включенным автоматическим подсчетом ссылок (ARC). Это заставило (точно такой же) код работать. (2) После этого я выключил свой компьютер, перезапустил его и реализовал (точно такой же) исходный код в другой раз, но снова БЕЗ ARC, как я сделал в самый первый раз. Невероятная вещь: после запуска проекта с поддержкой ARC и выключения моего компьютера. Теперь проект (сам по себе еще не включенный ARC) выполняется без ошибок, предупреждений, проблем или исходного сообщения об ошибке. Почему???   -  person noone    schedule 12.12.2011
comment
Если вы повторно реализовали свой код во второй раз, и он начал работать, это (за исключением действительно странных крайних случаев) просто означает, что в вашем исходном проекте была какая-то опечатка.   -  person Craig Otis    schedule 12.12.2011
comment
Я так не думаю, потому что я скопировал и вставил исходный код (это всего лишь три строки кода). Я бы не удивился, если копирование приведет к опечаткам, но исправление некоторых? - Я дважды проверю это. - - Есть ли способ проверить, включен ли ARC во время выполнения. Или есть возможность проверить после создания проекта?   -  person noone    schedule 12.12.2011


Ответы (1)


У меня есть решение!

Зная это, сообщение об ошибке имеет смысл:
Ответ кроется в используемых XIB-файлах.

Практическое правило:
Убедитесь, что все отправленные им события связаны с существующими методы!

Если это не так,
instance означает, что элемент GUI получает sent.
unrecognized selector означает, что к нему подключен несуществующий метод в InterfaceBuilder. ;-)

Помните, что одно событие может быть связано с несколькими методами. Если хотя бы один из них не определен (больше), вы получите эту ошибку. Имейте это в виду, если вы вручную удаляете, переименовываете или изменяете сигнатуры методов. Ранее установленная связь может все еще существовать.

person noone    schedule 12.12.2011
comment
Не мог бы кто-нибудь проголосовать за этот ответ - я не могу (Голосовать за свои ответы запрещено). - person noone; 12.12.2011
comment
Вы можете принять свой ответ по прошествии определенного времени, не обязательно голосовать за него. - person jrturton; 12.12.2011
comment
Спасибо - только что обнаружил, что это возможно tomorrow. - person noone; 12.12.2011