Сбой при использовании распознавателей жестов в StoryBoard
UPDATE
Это старый вопрос для старой версии Xcode. Оказалось, что проблема была ошибкой в Xcode, которая была исправлена.
Оригинал
У меня есть раскадровка, созданная при создании нового приложения iphone для вкладок (с ARC)
В одной из моих вкладок, если я перетаскиваю признак распознавания жестов (любой, но пусть сканер) на элемент управления, а затем установите селектор в действие, он просто сработает, как только я перейду на вкладку.
В консоли нет ничего - похоже, это происходит во время загрузки раскадровки (viewDidLoad никогда не вызывается).
- Я не могу понять, как получить дополнительную информацию.
- На другой вкладке это работает отлично. Обе вкладки были созданы автоматически.
(возможно, я что-то испортил в представлении, но у меня нет подсказки, чтобы выяснить, что я сделал).
Если я делаю жесты программно, они работают нормально, но приятно работать в раскадровке, и я боюсь, что что-то не так, в какой-то момент приведет к сбою в работе.
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ
В симуляторе я получаю
-[__NSCFString setView:]: unrecognized selector sent to instance 0x6d2db70
Опять же, нужны методы отладки - например, есть ли способ узнать, что такое объект 0x6d2db70?
Это точно так же, как этот вопрос (без ответа):
Функция распознавания жестов в интерфейсе построит сбой моего приложения
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ
Это тривиально для воспроизведения
- Новое приложение с вкладками iPhone, ARC и раскадровка на
- Жест перетаскивания на второй вкладке (работает на первом)
- Создайте (IBAction)
- Подключите соединение селектора жестов к действию С# 3
- запустите, перейдите во вторую вкладку
Сбои. То же самое с моим приложением, вкладкой по умолчанию, другие вкладки не
Ответы
Ответ 1
Сообщение об ошибке сообщает нам, что программа отправляет сообщение setView:
в экземпляр __NSCFString
(который, очевидно, является частным классом реализации NSString
).
Убедитесь, что вы пытались запустить с включенными зомби. Зомби могут легко вызвать непризнанную ошибку селектора.
Если это не зомби, установите точку останова на -[NSObject doesNotRecognizeSelector:]
. Когда точка останова ударяется, вы можете выяснить проблему только из трассировки стека. Если нет, вы можете напечатать debugDescription
объекта (что является таким же, как description
для большинства классов).
В симуляторе вы можете попросить отладчика напечатать объект debugDescription
следующим образом:
(gdb) frame 0
#0 0x013bcbff in -[NSObject doesNotRecognizeSelector:] ()
(gdb) po ((int*)$ebp)[2]
this is my test string
На устройстве вы выполните следующее:
(gdb) frame 0
#0 0x344bca22 in -[NSObject doesNotRecognizeSelector:] ()
(gdb) po $r0
this is my test string
Update
Основываясь на ваших шагах по воспроизведению, это ошибка в UIKit. Распечатайте отчет об ошибке. Вы можете обойти ошибку, создав сильную розетку на SecondViewController
и подключив ее к распознавателю жестов. Убедитесь, что розетка установлена на нуль в viewDidUnload
.
Update
Никогда не устанавливайте розетку в нуль - часть ошибки заключается в том, что UIKit не сохраняется - вам нужно сохранить свою ссылку, чтобы убедиться, что распознаватели не освобождены.
Ответ 2
В моем случае, при автоматическом создании IBOutlet для распознавателя жестов с помощью drag-n-drop в коде, Xcode правильно создал свойство с "сильным" атрибутом, но также добавил "set to nil" в viewDidUnload. Удаление "set to nil" решило проблему для меня.