2013-09-25 116 views
3

我們在AppStore上有一款iOS遊戲,有些用戶因爲升級到iOS 7而報告了問題。我們已經更新了遊戲以在iOS 7上運行,並且已經通過多種設備進行了廣泛的測試。但是,我們有一些用戶報告崩潰,有時候我們已經測試了完全相同的設備並重新測試了遊戲。 崩潰日誌,被symbolicated後,內容如下: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

嘗試在視圖中檢查彩色動畫。也許你從[UIColor colorWithRed:green:blue:alpha:]到[UIColor whiteColor]執行某處動畫?或[UIColor blackColor]? –

+0

另一種可能的變體是您在應用程序中有後臺任務。某些UI代碼可能會在後臺執行並導致崩潰。 –

+0

也可以執行一些comletion塊,並可能更改已經不在視圖層次結構中的視圖的屬性。但它只是試圖猜測 - 發佈日誌不足以修復崩潰 - 讓QA團隊檢測到什麼序列的用戶操作會導致崩潰,這將幫助您找出原因 –

回答

1

我建議這是問題

5的CoreFoundation 0x2d3c4022 __53- [__NSArrayI enumerateObjectsWithOptions:usingBlock:] _block_invoke + 50

我使用針對交錯的動畫塊枚舉並導致我的應用程序崩潰,消息「

[UIViewAnimationState release]:mes聖人發送到釋放實例

我正在使用ARC和靜態方法調用,所以不知道爲什麼會發生這種情況。

但是,將此循環更改爲foreach樣式循環可修復此問題。塊內的塊在iOS5和6下工作正常,但給出奇怪的結果,然後在iOS7中崩潰

+0

我沒有使用塊枚舉器遍歷任何一組動畫,所以我很確定這不是我的問題。謝謝 – elibud

+0

此修復程序適用於我。 –

+3

'_block_invoke'是否意味着崩潰發生在塊內? – Gon

1

崩潰報告中缺少一些內容,主要是異常(解除分配的實例?缺少選擇器?),但我們仍然可以推導出一些東西:

[UIWindow sendEvent:]

這是來自事件來處理呼叫,可能是觸摸用戶所作。

我猜UIKit代碼然後檢查是否可以通過檢查是否有一些活動的動畫_UIViewLayerAnimationCanBeConsideredFinished來檢索事件。

我也猜測它是窗口圖層中的一些動畫。你是在創建自己的窗口還是直接添加視圖到UIWindow?或者也許用動畫改變根視圖控制器?

無論如何,嘗試在動畫過程中嘗試觸摸屏幕,總是嘗試視圖出現和消失的視圖。

+0

當用戶在短時間內點擊兩次屏幕時,它與某些相關的兩個動畫交互。在崩潰時,我沒有修改與UIWindow或根視圖控制器相關的任何內容。由於這是導致生產崩潰,我只需要刪除其中一個動畫,並對問題進行了排序,但即使知道哪個動畫是罪魁禍首,我也無法弄清楚問題所在。這兩個動畫似乎配置正確,並且在iOS 7之前工作正常。 – elibud

+0

@EliBud你能分享更多關於動畫的細節嗎? – Sulthan

0

enumerateObjectsWithOptions:usingBlock使用後臺線程。如果其中一個後臺線程在GUI對象上工作(動畫當然會算在內),它會崩潰。

當發生崩潰時,轉到Xcode的左側並選擇調試導航器。您很可能會在線程x不相等的線程1中看到崩潰。只有作爲GUI線程的線程1才允許與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中的動畫GUI工作)使用快速枚舉,而不是enumerateObjectsWithOptions的:使用塊並以這種方式避免後臺線程。

我猜的iOS 7使用了更多的內螺紋,也許iOS 6的是不能使用後臺線程與這些調用,因此未對6,但在7

玩得開心導致問題!

+0

我沒有使用enumerateObjectsWithOptions:usingBlock。無論如何,我最終不得不刪除動畫,因爲我找不到問題的根源。 – elibud

+0

你的崩潰日誌包含「NSArrayI enumerateObjectsWithOptions:usingBlock:」;-) – MacMark

+0

我知道它確實存在,但它在CoreFundation代碼中,不是我的。 – elibud