EDIT: Я определил, что следующее только на симуляторе Retina для iPad и на моем iPad Mini 3 тестовом устройстве. Это происходит в 100% случаев по этим целям и никогда на других симуляторах iPad или iPhone (iPad Air/Air 2, iPad Pro, iPhone с 5 по 7 Plus). У меня нет других устройств для тестирования.EXC_BAD_ACCESS при длительной печати; no zombie activity
У меня есть приложение, написанный на Swift, который отображает UITableView
, где я добавил UILongPressGestureRecognizer
к пользовательскому вид внутри каждой ячейки. Приложение не работает хорошо, пока я долго-пресс на строке, после чего приложение останавливается с
Тема 1: EXC_BAD_ACCESS (код = 1, адрес = 0xd08600b6)
(адрес изменяется дико и кажется довольно случайным. Иногда это 0x0.) Когда происходит сбой, на консоли отладки не выводится. Сам XCode открывается в первую строку объявления класса для моего делегата приложения.
Я поставил точку останова в первой строке моего обработчика событий с длинным нажатием, но приложение падает до того, как точка останова попадет. Я также добавил контрольную точку исключения, но она тоже не поймает проблему.
Я включил объекты зомби в схему, но ничего не появляется. Я попытался запустить приложение с помощью инструментов и шаблона зомби; приложение просто останавливается, и инструменты не отмечают никакой активности зомби. В анализе XCode нет проблем.
Я не знаю, как это может быть актуально, но эта проблема новая, поскольку я впервые заархивировал приложение в рамках подготовки к распространению тестеров. До этого приложение работало безупречно на тренажерах и на тестовом устройстве. Сначала проблема возникла при первом запуске и запуске дистрибутива .ipa-файла на устройстве. Затем я вернулся к симулятору и нашел такое же поведение. Я очистил проект, очистил папку сборки, перезагрузил мою машину разработки и сделал все, что я могу придумать, чтобы работать в первозданном состоянии. Нет разницы.
Я в затруднении, как добиться прогресса в отслеживании этого. Любые предложения будут ценны.
Дополнительная информация
Оказывается, что авария происходит внутри #selector
объекта, который был передан в UILongPressGestureRecognizer
инициализаторе. Вот стек вызовов из навигатора панели Debug:
# 0 0x006e7295 в objc_retain()
# 1 0x0007529f в @objc TikkunRowView.onLongPress (отправитель: UILongPressGestureRecognizer, forEvent: UIEvent) ->()()
# 2 0x01cc6d3b в - [UIGestureRecognizerTarget _sendActionWithGestureRecognizer:]()
# 3 0x01ccf75e в _UIGestureRecognizerSendTargetActions()
# 4 0x01cccdee в _UIGestureRecognizerSendActions()
# 5 0x01ccbca8 в - [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: Определите строку, вызывающую сбой: 'Если это сбой в симуляторе, тогда выполнение должно прекратиться в строке, вызывающей ошибку. Если нет, добавьте контрольную точку исключения. Добавьте код, указывающий, какое выполнение строки прекращается. 'Шаг 2: Пусть люди просмотрят журнал сбоев:' Пожалуйста, добавьте соответствующий символический журнал сбоев. –
Проверьте терминал. Что-то там выводится? Обычно появляется сообщение об ошибке. Кроме того, причиной такой проблемы является неявное развертывание быстрой опции. –
@RoboticCat - XCode останавливается в объявлении класса для моего делегата приложения, а не в любом исполняемом коде. В консоли нет аварийного журнала. –