Сбой при использовании распознавателей жестов в StoryBoard

ОБНОВЛЕНИЕ

Это старый вопрос для старой версии Xcode. Оказалось, что проблема заключалась в ошибке в Xcode, которая была исправлена.

Исходный

У меня есть раскадровка, созданная при создании приложения для новой вкладки iphone (с ARC)

На одной из моих вкладок, если я перетаскиваю распознаватель жестов (любой, но, скажем, Pan) на элемент управления, а затем устанавливаю селектор на действие, он просто вылетает, как только я перехожу на вкладку.

В консоли ничего нет — похоже, это происходит во время загрузки раскадровки (viewDidLoad никогда не вызывается).

  1. Я не могу понять, как получить больше информации
  2. На другой вкладке это работает нормально. Обе вкладки были сгенерированы автоматически.

(возможно, я что-то напутал в представлении, но я понятия не имею, что я сделал).

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

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ

В симуляторе я получаю

-[__NSCFString setView:]: unrecognized selector sent to instance 0x6d2db70

Опять же, нужны методы отладки — например, есть ли способ узнать, что такое объект 0x6d2db70?

Что точно похоже на этот вопрос (без ответа):

Распознаватель жестов в конструкторе интерфейсов приводит к сбою моего приложения

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ

Это тривиально воспроизвести

  1. Новое приложение для iPhone с вкладками, ARC и Storyboard on
  2. Перетащите жест касания на вид второй вкладки (работает на первой)
  3. Создать (IBAction)
  4. Подключите соединение селектора жеста к действию из # 3
  5. запустить, перейти на вторую вкладку

Сбои. То же самое с моим приложением, вкладка по умолчанию работает, другие вкладки - нет.


person Lou Franco    schedule 27.01.2012    source источник
comment
Что за авария? СИГАБРТ? EXC_BAD_ACCESS? Что такое трассировка стека?   -  person rob mayoff    schedule 27.01.2012
comment
В том-то и дело, что в консоли ничего нет. Трассировка стека вернулась к основной в пуле релизов (так что это похоже на повреждение памяти). Нужны идеи для получения дополнительной информации.   -  person Lou Franco    schedule 27.01.2012
comment
Я сделал МНОГО отладки iPhone, но плохо знаком с 4.2, ARC и т. д. Мне нужны идеи для новых методов (я знаю о зомби, отладке malloc и т. д., но они не кажутся подходящими).   -  person Lou Franco    schedule 27.01.2012
comment
Кроме того, есть ли соединение, которое мне нужно сделать, кроме селектора? Подключается ли он к IBAction с отправителем (id)? Кажется, я не могу найти хороших документов по этому поводу.   -  person Lou Franco    schedule 27.01.2012
comment
Трассировка стека, указывающая на main, обычно указывает на то, что было создано исключение. У вас есть точка останова исключения?   -  person rob mayoff    schedule 27.01.2012
comment
Помимо установки цели и действия распознавателя, он должен быть по крайней мере в одной коллекции выходов gestureRecognizers представления. Вы делаете это, опуская распознаватель на представление. Но это должно быть безвредно, если его нет ни в одной gestureRecognizers коллекции.   -  person rob mayoff    schedule 27.01.2012
comment
Не рядом с моим компьютером прямо сейчас - проверю все это, когда доберусь до него - спасибо. @rob, добавьте ответ - я думаю, вы дали мне достаточно, чтобы решить - я отредактирую его с результатами. Спасибо.   -  person Lou Franco    schedule 27.01.2012
comment
Это тривиально воспроизвести - я думаю, что это ошибка   -  person Lou Franco    schedule 29.01.2012
comment
Убедитесь, что цель распознавателя жестов не освобождена   -  person onmyway133    schedule 02.06.2015


Ответы (2)


Сообщение об ошибке сообщает нам, что программа отправляет сообщение 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

Обновлять

Судя по вашим шагам по воспроизведению, это ошибка в UIKit. Отправьте отчет об ошибке. Вы можете обойти ошибку, создав надежный выход на SecondViewController и подключив его к распознавателю жестов. Убедитесь, что в viewDidUnload для выхода установлено значение nil.

Обновлять

Никогда не устанавливайте для своего выхода значение nil — часть ошибки заключается в том, что UIKit не сохраняет — вам нужно сохранить свою ссылку, чтобы убедиться, что распознаватели не выпущены.

person rob mayoff    schedule 28.01.2012
comment
включение зомби говорит, что жест касания - это зомби. -[UITapGestureRecognizer keep]: сообщение отправлено на освобожденный экземпляр 0x6b5ba80 - person Lou Franco; 28.01.2012
comment
Я только что заметил, что UIImageView не имеет коллекцииgestRecognizers - у меня есть другие UIImageView, где работают жесты (также есть предупреждение IB в инспекторе). - person Lou Franco; 28.01.2012
comment
Свойство gestureRecognizers является частью UIView, поэтому UIImageView наследует его. Он не помечен IBOutletCollection, поэтому он отображается в IB, только если вы перетащите распознаватель в представление. - person rob mayoff; 29.01.2012
comment
Есть ли у вас какие-либо unsafe_unretained точки продаж или переменные? - person rob mayoff; 29.01.2012
comment
Или какие-то assign свойства? В ARC assign совпадает с unsafe_unretained. - person rob mayoff; 29.01.2012
comment
Это тривиально воспроизвести - я думаю, что это ошибка (см. обновленный вопрос) - person Lou Franco; 29.01.2012
comment
Все сильно - у меня есть тривиальный проект, который это воспроизводит. Нет выходов или каких-либо переменных - person Lou Franco; 29.01.2012
comment
Я именно так и сделал — рад, что вы согласны. Я использую ARC — нужно ли устанавливать для выхода значение nil? - person Lou Franco; 29.01.2012
comment
Этому Apple присвоил идентификатор проблемы: 10771117. Я обновлю этот вопрос, если узнаю, что он был исправлен. - person Lou Franco; 29.01.2012
comment
Вам нужно установить для выхода значение nil в viewDidUnload. В противном случае он не будет выпущен при предупреждении о памяти. - person rob mayoff; 29.01.2012
comment
К сожалению, вы не можете освободить в viewDidUnload — когда приходит предупреждение о памяти, приложение падает, потому что UIKit не сохраняет сохранение — вы должны удерживать свое (вы можете увидеть это, установив значение nil в viewDidUpload и смоделировав предупреждение о памяти -- у вас произойдет сбой при смене вкладок с предупреждением о зомби) - person Lou Franco; 31.01.2012
comment
Вау! Я тоже сталкивался с этой проблемой, и только когда я просмотрел журнал устройств в Организаторе и обнаружил, что DoesNotRecognizeSelector был вызван пролистыванием, мне удалось найти эту страницу. У меня та же проблема, и вышеописанное исправление сработало (просто Ctrl + перетащите жест смахивания в файл заголовка вспомогательного контроллера представления и сделайте его сильным выходом - проблема решена). Спасибо! - person Shaun McCarthy; 27.03.2012

В моем случае при автоматическом создании IBOutlet для распознавателя жестов путем перетаскивания в коде Xcode правильно создал свойство с атрибутом «сильный», но также добавил «нуль» в viewDidUnload. Удаление «установить на ноль» решило проблему для меня.

person Ben G    schedule 21.06.2012
comment
Это имеет смысл - я столкнулся с тем же самым после того, как вручную добавил IBOutlet стандартным способом. - person Lou Franco; 21.06.2012