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;