Сбой при использовании распознавателей жестов в 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" решило проблему для меня.