2017-02-14 3 views
1

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:))) 
+0

Шаг 1: Определите строку, вызывающую сбой: 'Если это сбой в симуляторе, тогда выполнение должно прекратиться в строке, вызывающей ошибку. Если нет, добавьте контрольную точку исключения. Добавьте код, указывающий, какое выполнение строки прекращается. 'Шаг 2: Пусть люди просмотрят журнал сбоев:' Пожалуйста, добавьте соответствующий символический журнал сбоев. –

+0

Проверьте терминал. Что-то там выводится? Обычно появляется сообщение об ошибке. Кроме того, причиной такой проблемы является неявное развертывание быстрой опции. –

+0

@RoboticCat - XCode останавливается в объявлении класса для моего делегата приложения, а не в любом исполняемом коде. В консоли нет аварийного журнала. –

ответ

1

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

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