2016-02-03 86 views
1

當我將應用程序置於後臺時,等待幾分鐘,然後重新激活應用程序,應用程序通常會凍結整個手機。當我在調試器暫停的應用程序,我可以看到,主線程在等待一個信號:應用程序在後臺凍結

Thread 1 Queue: com.apple.main-thread (serial) 
    0 semaphore_wait_trap 
    2 _dispatch_barrier_sync_f_slow 
    3 -[AAEventsManager addEvent:parameters:async:] 
    4 -[AAEventsObserver onApplicationStateChanged:] 
    5 __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER_ 
    --------------------------------------------------------- 
    23 UIApplicationMain 
    24 main 
    25 start 

我applicationWillEnterForeground沒有代碼和應用程​​序凍結applicationDidBecomeActive之前調用。如果我添加一個後臺計時器,它可以建立網絡連接,當應用程序和iPhone UI凍結時,它們會在applicationWillEnterForeground之後運行,但連接總是失敗。有時應用程序幾乎立即重新啓動,當它被視爲凍結前景。應用程序的CPU使用率爲0%,內存使用量爲25MB,能源影響爲零。

我已經測試了幾款iPhone 6設備,其中有iOS 9.2。

任何想法發生了什麼?

+0

您是否使用了一些前綴爲「AA」的第三方代碼或庫? – Darko

+0

我試圖儘量減少第三方代碼的使用,並且對pod項目的快速區分大小寫搜索顯示沒有帶前綴「AA」的類。 – Tapani

+0

其他線程呢?例如,是否有東西在等待發送到主線程? –

回答

0

最後發現AAEventsManager屬於AppAnalytics pods lib.It是一個二進制庫,所以這就是爲什麼我沒有找到類名。刪除了lib並不再凍結。

+0

並且您通過返回提交層次來發現錯誤? – Darko

+0

不,我沒有。但無論如何這是個好主意。 – Tapani

1

你使用一些版本控制? GIT?如果是,則跳回幾個版本,並查看第一次發生錯誤的哪個提交 - 這是查找此類奇怪錯誤的最簡單方法。

找到提交錯誤的最快方法是應用二進制搜索算法。讓我們假設你有100次的提交:

  • 第一次檢查,如果錯誤發生在提交1
  • 如果是的話,你發現有錯誤的代碼,如果沒有跳到一半(提交50)
  • 如果錯誤出現在此提交中,則跳至提交75,如果不是再次提交到一半(提交25)
  • 等等......總是提高一半或一半,直到找到確切的提交錯誤。
+0

是的,我正在使用GIT。不知道在Swift語法不再與新的Xcode兼容之前,我能跳多遠。 – Tapani

+2

試試看,這似乎是你最好的選擇。 – Darko

相關問題