我使用fabric.io来跟踪用户设备上的崩溃。我收到许多崩溃报告,其中包含以下堆栈跟踪:
0 libobjc.A.dylib 0x33e9ef46 objc_msgSend + 5
1 UIKit 0x29698225 +[UIViewController _viewControllerForFullScreenPresentationFromView:] + 196
2 UIKit 0x29697cfb -[UIWindow _scrollToTopViewsUnderScreenPointIfNecessary:resultHandler:] + 442
3 UIKit 0x29697b1f -[_UIScrollsToTopInitiatorView touchesEnded:withEvent:] + 214
4 UIKit 0x29697a41 -[UIStatusBar touchesEnded:withEvent:] + 416
5 UIKit 0x295fc245 forwardTouchMethod + 236
6 UIKit 0x294ae567 -[UIWindow _sendTouchesForEvent:] + 522
7 UIKit 0x294a7e31 -[UIWindow sendEvent:] + 544
8 UIKit 0x2947e759 -[UIApplication sendEvent:] + 196
9 UIKit 0x296f22f9 _UIApplicationHandleEventFromQueueEvent + 14168
10 UIKit 0x2947d1a9 _UIApplicationHandleEventQueue + 1352
11 CoreFoundation 0x25f27fbf __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 14
12 CoreFoundation 0x25f273cf __CFRunLoopDoSources0 + 218
13 CoreFoundation 0x25f25a35 __CFRunLoopRun + 772
14 CoreFoundation 0x25e733b1 CFRunLoopRunSpecific + 476
15 CoreFoundation 0x25e731c3 CFRunLoopRunInMode + 106
16 GraphicsServices 0x2d3d3201 GSEventRunModal + 136
17 UIKit 0x294dd43d UIApplicationMain + 1440
所以在整个堆栈跟踪中,我的代码没有一行。我想不出为什么会发生这种情况。
有没有人有同样的问题或想法如何解决这个问题?
提前致谢
答案 0 :(得分:1)
我遇到了类似的问题,我得到的崩溃报告几乎和你的一样。
当用户点击状态栏以在UIScrollView中滚动到顶部时,崩溃必定是应用崩溃的情况。这正是我遇到的。
根本原因是我在调用viewDidAppear之前调用[UIScrollView setContentOffset:]。
如果在视图控制器外观之前调用UIScrollView setContentOffset,iOS系统将在解除分配后尝试保留您的UIScrollView实例,从而产生SIGEV或SIGBUS。
如果使用“启用僵尸对象”调试应用程序,您肯定会得到类似于
的内容[UIScrollView retain]:将消息发送到解除分配的实例 0x1371a7600
。
如果您想重现崩溃,我建议您执行以下操作。
创建两个视图控制器,两者都将UIScrollView实例添加到视图层次结构中。
将它们推送到导航堆栈并确保在viewDidLoad中调用setContentOffset,并在viewDidAppear之前调用它们。
弹出一个视图控制器并将另一个保留在导航堆栈中
点按状态栏。
解决方案是你应该检查视图控制器的view.window属性是否为nil,如果它是nil,不要调用UIScrollView实例的setContentOffset,延迟对setContentOffset的所有调用,直到view.window为非nil。 / p>
我还写了一篇关于此的博客文章。虽然我的博客是中文的,但我在崩溃时添加了调用堆栈的屏幕截图,你可以看到调用堆栈与这个问题的堆栈相同