2013-08-06 66 views
1

我已經在這幾天,並在幾天前問this question。我認爲這可能更好地更清楚地重述這個問題。調試在Xcode中看似隨機的例外

我在UINavigationController中有一系列UICollectionViewControllers。每次用戶進行選擇時,都會在屏幕上推送新的集合視圖,並且此集合視圖負責從API中獲取其內容。

有時候這裏有一個崩潰。例外情況每次都有所不同。通常情況下,它是下列之一:

*** Collection <NSConcreteMapTable: 0x1922cf60> was mutated while being enumerated. 

OR

*** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSSetM: 0x203f26b0> was mutated while being enumerated.' 

有時甚至不拋出異常,但該程序將在「空線」的說法error: address doesn't contain a section that points to a section in a object file暫停。最後,當選擇一個項目時,這個錯誤可以更一致地重現,新的視圖被按下,然後一出現就快速按下後退按鈕。但是它也可以在沒有後退按鈕的情況下發生。

我附上了我自己的未捕獲異常處理程序來打印出堆棧跟蹤。在所有情況下,我自己的課程都不在追蹤中。

我有'突破異常'集,但它永遠不會停止任何有意義的地方 - 通常是一些不倫不類的彙編代碼,只讀trap或UIApplicationMain。

所以我的問題是:哪裏可以開始調試呢?

如果有幫助,我可以發佈一個堆棧跟蹤的例子。

回答

0

首先,在Xcode中設置一個異常斷點。它會在之前停止引發異常,所以你知道是誰造成的。

什麼似乎發生的事情是,你有代碼

for (id object in somearray) ... 

和而循環運行,有人修改的someArray。這是致命的。您可能需要考慮如何編寫代碼。例如,你可以只寫

爲(以ID對象[副本的someArray])...

,然後你可以修改的someArray你喜歡。也許你的代碼不是線程安全的,另一個線程修改somearray,而一個線程遍歷它。