今天做項目的時候遇到一個問題,就是我們在AppDelegate中載入了兩個view視圖,都包含UITableView,一個當前可見(AView),一個當前不可見(BView)。當在可見(AView)的View中選擇Cell的時候會同步到BView中。
恩……我們在模擬器上偵錯工具的時候一切正常,但是使用版本為ios 4.x & 5.x & 6.x的iPhone 4時都會出現選到大於6條資料的時候,BView裡只顯示少量或者乾脆沒有資料。我們打斷點的時候得知NSArray中資料存在並沒有丟失,而且iPhone 4S調試也正常,僅僅只是iPhone4有問題,這就比較奇怪。
首先我們認為這個Bug屬於記憶體硬體問題,因為模擬器和4S一切正常,所以排除邏輯問題,我們認為是左邊的Cell過多,導致系統記憶體吃緊回收了隱藏的BView視圖中的對象。可是通過分析Log和設定斷點,我們發現系統並沒有上報關於Memory low的相關資訊,而且也沒有調用viewDidUnload和didReceiveMemoryWarning。所以最終我們排除了記憶體問題。
這樣開來只能是邏輯問題了,但是不科學的是邏輯問題為什麼模擬器和4s沒法複現?於是在大量的代碼最佳化和調試之後,我們終於定位到BView資料存在問題的原因是調用了BView中UITableView的reloadData,但是沒有回調其Delegate的numberOfRowsInSection和CellForRow,所以導致介面沒有更新。
然後360了一下,發現有很多人遇到了類似的問題,至少我們的原因是在一個子線程中調用了reloadData,所以導致機率沒有重新整理UITableView。解決的辦法很簡單,就是把reloadData
perform到主線程裡就可以了。
這個事情雖然解決了,但是需要注意的是:
1.在安卓中子線程是不能修改UI的,在IOS中應該也不行。雖然系統沒有報錯且可以正常運行,但是以後寫代碼還需要盡量注意。
2.viewDidUnload不僅在視圖release的時候會調用,在記憶體吃緊的時候同樣會調用
3.這個Bug我們只能暫且認為是iPhone4的CPU太挫了,子線程高速計算不及時導致的Bug。不管怎麼說這問題是代碼邏輯問題。