我们在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
我完全不知道从哪里开始,任何建议都将不胜感激。
答案 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上。
玩得开心!