Авария iOS UICalloutBar

Я получаю следующий отчет о сбоях для своего приложения. Любые идеи относительно того, как я буду отлаживать что-то вроде этого?

Crashed: com.apple.main-thread
EXC_BAD_ACCESS KERN_INVALID_ADDRESS at 0x417d37f6

Thread 0: Crashed: com.apple.main-thread
0  libobjc.A.dylib                0x39048b26 objc_msgSend + 5
1  UIKit                          0x310643ed +[UICalloutBar fadeSharedCalloutBarIfNeededForTouchInView:window:] + 80
2  UIKit                          0x31064365 -[UITouchesEvent _dismissSharedCalloutBarIfNeeded] + 228
3  UIKit                          0x3102cf87 _UIApplicationHandleEventQueue + 7070
4  CoreFoundation                 0x2e882183 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 14
5  CoreFoundation                 0x2e881653 __CFRunLoopDoSources0 + 206
6  CoreFoundation                 0x2e87fe47 __CFRunLoopRun + 622
7  CoreFoundation                 0x2e7eac27 CFRunLoopRunSpecific + 522
8  CoreFoundation                 0x2e7eaa0b CFRunLoopRunInMode + 106
9  GraphicsServices               0x334de283 GSEventRunModal + 138
10 UIKit                          0x3108e049 UIApplicationMain + 1136
11 App                            0x000d441f main (main.m:6)

Я не использую UICalloutBar в любом месте моего кода. Кажется, что это происходит на разных устройствах, но только в iOS7 и всегда, когда приложение сфокусировано.

Я видел это, но на самом деле это не помогло: Что такое UICalloutBarButton, и почему это приводит к сбою моего приложения?

Ответ 1

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

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

Например, для popover вы обычно касаетесь пункта меню popover, и он отклоняется. Но как насчет того, чтобы снова нажать заголовок popover (чтобы отключить его), или нажмите за пределами popover (что означает, что вы отключите popover)?

Другим примером является то, что пользователь должен сделать выбор в меню, но есть кнопка возврата, которую они могут нажать, чтобы выполнить резервное копирование. Возможно, вы не используете систему таким образом, но пользователи могут нажать в таких местах.

Наконец, если вы выполняете автоматизацию пользовательского интерфейса, вы можете попробовать Monkey Testing. То есть напишите script (или загрузите одну из реализаций с открытым исходным кодом), которая случайным образом нажимает на экран. Пусть он запускается в вашем приложении и видит, что он трясет - обычно он находит проблемы с touch в даже надежных приложениях.