UITableView調用reloadData不重新整理的Bug

來源:互聯網
上載者:User

    今天做項目的時候遇到一個問題,就是我們在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。不管怎麼說這問題是代碼邏輯問題。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.