iOS 7神秘崩溃

时间:2013-09-25 15:28:15

标签: ios crash ios7 crash-reports

我们在AppStore上有一款iOS游戏,一些用户报告了问题,因为他们已经升级到iOS 7.我们已经将游戏更新到适用于iOS 7并且已经使用多种设备进行了广泛的测试。但是,我们有一些用户报告崩溃,有时在我们测试过的完全相同的设备上并重新测试游戏。 崩溃日志在被符号化后,如下所示:

Thread 0 Crashed:
0   CoreGraphics                    0x2d4ec9ca CGColorSpaceGetModel + 10
1   QuartzCore                      0x2f893842 CA_CGColorGetRGBComponents + 30
2   QuartzCore                      0x2f95a142 -[NSObject(CAAnimatableValue) CA_distanceToValue:] + 86
3   UIKit                           0x2fe10c72 _UIViewLayerAnimationCanBeConsideredFinished + 250
4   UIKit                           0x2fe10ae2 __22-[UIWindow sendEvent:]_block_invoke + 10
5   CoreFoundation                  0x2d3c4022 __53-[__NSArrayI enumerateObjectsWithOptions:usingBlock:]_block_invoke + 50
6   CoreFoundation                  0x2d3bda0a -[__NSArrayI enumerateObjectsWithOptions:usingBlock:] + 218
7   UIKit                           0x2fc1b556 -[UIWindow sendEvent:] + 522
8   UIKit                           0x2fbf0a20 -[UIApplication sendEvent:] + 192
9   UIKit                           0x2fbef21c _UIApplicationHandleEventQueue + 7092
10  CoreFoundation                  0x2d446188 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 12
11  CoreFoundation                  0x2d445656 __CFRunLoopDoSources0 + 202
12  CoreFoundation                  0x2d443e4a __CFRunLoopRun + 618
13  CoreFoundation                  0x2d3aece2 CFRunLoopRunSpecific + 518
14  CoreFoundation                  0x2d3aeac6 CFRunLoopRunInMode + 102
15  GraphicsServices                0x320cf27e GSEventRunModal + 134
16  UIKit                           0x2fc50a3c UIApplicationMain + 1132
17  MyGame                          0x00104382 main (main.m:13)
18  MyGame                          0x0010435c ___lldb_unnamed_function455$$MyGame + 36

我完全不知道从哪里开始,任何建议都将不胜感激。

3 个答案:

答案 0 :(得分:1)

我建议这是问题

  

5 CoreFoundation 0x2d3c4022 __53- [__ NSArrayI enumerateObjectsWithOptions:usingBlock:] _block_invoke + 50

我正在使用块枚举器进行交错动画,导致我的应用程序崩溃,并显示消息“

  

[UIViewAnimationState release]:发送到解除分配的实例的消息

我正在使用ARC和静态方法调用,因此不确定为什么会发生这种情况。

但是,将此循环更改为foreach样式循环可解决此问题。一个块内的块在iOS5和6中运行良好但是给出了奇怪的结果然后在iOS7中崩溃

答案 1 :(得分:1)

崩溃报告中缺少一些内容,主要是异常(解除分配的实例?缺少选择器?),但我们仍然可以推断出一些内容:

[UIWindow sendEvent:]

这是来自事件处理的来电,可能是用户做出的触摸

我猜UIKit代码然后通过检查是否存在一些活动动画_UIViewLayerAnimationCanBeConsideredFinished来检查事件是否可以被删除。

我也猜测它是窗口层中的一些动画。您是在创建自己的窗口还是直接向UIWindow添加视图?或者可能用动画更改根视图控制器?

无论如何,在动画期间尝试触摸屏幕,始终尝试出现的视图和消失的视图。

答案 2 :(得分:0)

enumerateObjectsWithOptions:usingBlock使用后台线程。如果其中一个后台线程确实可以在GUI对象上运行(当然动画计数),它就会崩溃。

发生崩溃时,请转到Xcode的左侧并选择调试导航器。你很可能会在Thread x不等的线程1中看到崩溃。只允许使用作为GUI线程的线程1来使用GUI。

要解决您的问题,您至少有两个选择:

a)将动画GUI工作放在dispatch_async或dispatch_sync块中,如

    …enumerateObjectsWithOptions:usingBlock … {

        // non GUI stuff    

        dispatch_async(dispatch_get_main_queue(), ^{ 
            // GUI work
            // non GUI stuff is also okay here
        });

        // non GUI stuff  

} // end of enumerateObjectsUsingBlock  

b)使用快速枚举而不是enumerateObjectsWithOptions:usingBlock并以这种方式避免使用后台线程。

我猜iOS 7使用更多的内部线程,也许iOS 6无法使用这些调用的后台线程,因此不会在6上引起问题,但在7上。

玩得开心!