EXC_BAD_ACCESS при длительном нажатии; нет активности зомби

РЕДАКТИРОВАТЬ: я решил, что следующее происходит только на iPad Retina симулятор и на моем тестовом устройстве iPad Mini 3. Это происходит в 100% случаев на этих мишенях и никогда на любом другом симуляторе iPad или iPhone (iPad Air/Air 2; iPad Pro; iPhone 5-7 Plus). У меня нет других устройств для тестирования.


У меня есть приложение, написанное на Swift, которое отображает UITableView где я добавил UILongPressGestureRecognizer к пользовательскому виду внутри каждой ячейки. Приложение работает нормально, пока я долго не нажимаю на строку, после чего приложение останавливается с

Поток 1: EXC_BAD_ACCESS (код =1, адрес = 0xd08600b6)

(Адрес сильно меняется и кажется довольно случайным. Иногда это 0x0.) Когда происходит сбой, в консоли отладки не выводится никакой информации. Сам XCode открывается в первой строке объявления класса для моего делегата приложения.

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

Я включил объекты зомби в схеме, но ничего не появляется. Я попытался запустить приложение, используя инструменты и шаблон зомби; приложение просто останавливается, и инструменты не отмечают активность зомби. Анализ XCode сообщает об отсутствии проблем.

Я не знаю, как это может быть актуально, но эта проблема является новой, поскольку я впервые заархивировал приложение при подготовке к распространению для тестировщиков. До этого приложение безупречно работало на симуляторах и на тестовом устройстве. Сначала проблема обнаружилась, когда я установил и запустил дистрибутивный файл.ipa на устройстве. Затем я вернулся к симулятору и обнаружил то же поведение. Я очистил проект, очистил папку сборки, перезагрузил мою машину для разработки и сделал все, что смогу, чтобы запустить в чистом виде. Нет разницы.

Я в недоумении, как добиться прогресса в отслеживании этого. Любые предложения будут ценны.

Дальнейшая информация

Похоже, что авария происходит внутри #selector объект, который был передан в UILongPressGestureRecognizer инициализатор. Вот стек вызовов из панели навигатора Debug:

# 0 0x006e7295 в objc_retain ()
#1 0x0007529f in @objc TikkunRowView.onLongPress (отправитель: UILongPressGestureRecognizer, forEvent: UIEvent) -> () ()
# 2 0x01cc6d3b in - [UIGestureRecognizerTarget _sendActionWithGestureRecognizer:] ()
# 3 0x01ccf75e в _UIGestureRecognizerSendTargetActions ()
# 4 0x01cccdee в _UIGestureRecognizerSendActions ()
# 5 0x01ccbca8 in - [UIGestureRecognizer _updateGestureWithEvent: buttonEvent:] ()
# 6 0x01cb6670 в _UIGestureEnvironmentUpdate ()

И вот код в #1 выше, где происходит сбой (calll со смещением <+42>):

Tikkun Sample`@objc TikkunRowView.onLongPress(sender : UILongPressGestureRecognizer, forEvent : UIEvent) -> ():
    0x60270 <+0>:   pushl  %ebp
    0x60271 <+1>:   movl   %esp, %ebp
    0x60273 <+3>:   pushl  %esi
    0x60274 <+4>:   subl   $0x24, %esp
    0x60277 <+7>:   movl   0x14(%ebp), %eax
    0x6027a <+10>:  movl   0x10(%ebp), %ecx
    0x6027d <+13>:  movl   0x8(%ebp), %edx
    0x60280 <+16>:  movl   %ecx, (%esp)
    0x60283 <+19>:  movl   %ecx, -0x8(%ebp)
    0x60286 <+22>:  movl   %edx, -0xc(%ebp)
    0x60289 <+25>:  movl   %eax, -0x10(%ebp)
    0x6028c <+28>:  calll  0x7c9ec                   ; symbol stub for: objc_retain
    0x60291 <+33>:  movl   -0x10(%ebp), %ecx
    0x60294 <+36>:  movl   %ecx, (%esp)
    0x60297 <+39>:  movl   %eax, -0x14(%ebp)
    0x6029a <+42>:  calll  0x7c9ec                   ; symbol stub for: objc_retain
>>  0x6029f <+47>:  movl   -0xc(%ebp), %ecx << CRASH HAPPENS WITH THIS LINE HIGHLIGHTED
    0x602a2 <+50>:  movl   %ecx, (%esp)
    0x602a5 <+53>:  movl   %eax, -0x18(%ebp)
    0x602a8 <+56>:  calll  0x7c9ec                   ; symbol stub for: objc_retain
    0x602ad <+61>:  movl   -0x8(%ebp), %ecx
    0x602b0 <+64>:  movl   %ecx, (%esp)
    0x602b3 <+67>:  movl   -0x10(%ebp), %edx
    0x602b6 <+70>:  movl   %edx, 0x4(%esp)
    0x602ba <+74>:  movl   -0xc(%ebp), %esi
    0x602bd <+77>:  movl   %esi, 0x8(%esp)
    0x602c1 <+81>:  movl   %eax, -0x1c(%ebp)
    0x602c4 <+84>:  calll  0x5fd40                   ; Tikkun_Sample.TikkunRowView.onLongPress (sender : __ObjC.UILongPressGestureRecognizer, forEvent : __ObjC.UIEvent) -> () at TikkunRowView.swift:128
    0x602c9 <+89>:  movl   -0xc(%ebp), %eax
    0x602cc <+92>:  movl   %eax, (%esp)
    0x602cf <+95>:  calll  0x7c9e6                   ; symbol stub for: objc_release
    0x602d4 <+100>: addl   $0x24, %esp
    0x602d7 <+103>: popl   %esi
    0x602d8 <+104>: popl   %ebp
    0x602d9 <+105>: retl   

Я не эксперт по чтению этого материала, но похоже, что происходит сбой в сгенерированном компилятором коде, который должен отправляться в мой метод обработчика событий. Я понятия не имею, какие объекты проверяет этот код, прежде чем вызывать мой код (со смещением <+84>). Вот код, который я использую для создания распознавателя жестов:

let g = UILongPressGestureRecognizer(target: self, action: #selector(TikkunRowView.onLongPress(sender:forEvent:)))

1 ответ

Решение

Я не знаю, почему консоль не выдавала вам подробных сообщений об ошибках. (Должно!) Но, глядя на ваш код, это, очевидно, связано с неправильной сигнатурой обратного вызова жеста. Ниже приводится цитата из Api Doc.

Вызываемые методы действия должны соответствовать одной из следующих подписей:
- (void) handleGesture;
- (void) handleGesture: (UIGestureRecognizer *) жест Recognizer;

Другие вопросы по тегам