天天看點

iOS開發:UITableView加載多張照片導緻記憶體上漲的問題

最近在寫一個檔案管理的頁面,裡面功能挺多的,有縮略圖下載下傳(socket),有檔案下載下傳(http)。

說說縮略圖下載下傳這一塊,我的UITableView的一個cell要加載四張縮略圖,iPhone5s的螢幕能加載8行。大概UI上是這樣布局的。(另外縮略圖需要一張張下載下傳)

剛開始進到檔案管理界面,記憶體占用20幾M,随着縮略圖不斷下載下傳下來記憶體在上漲,我不斷的往上拉,記憶體一值在漲。達到一定值app出現閃退。大概是300多M的時候閃退。什麼原因造成的呢?

先看下圖:

iOS開發:UITableView加載多張照片導緻記憶體上漲的問題

我是這樣寫的:建立一個對象,這個對象有一個屬性是UIImage。對象儲存在數組裡面。大概有800多張照片。

當縮略圖沒有下載下傳下來的時候,我加載的是一張預設圖檔。當縮略圖下載下傳下來的時候,我就把下載下傳下來的縮略圖賦給相應對象的UIImage屬性。

cell是重用的,這樣看應該是沒有什麼問題的。但是記憶體就是不斷上漲,而且是不動的時候,記憶體不漲,上下滑動UITableView,記憶體不斷上漲。

我一直在思考cell是重用的,記憶體怎麼會不斷上漲呢?問題不是cell引起的,而是上面我說的那個對象的UIImage屬性引起的。

思考一下,縮略圖不斷下載下傳下來, 下載下傳下來的縮略圖都賦給對象的UIImage屬性,而對象又在數組裡面,可想而知,800多張縮略圖不斷下載下傳記憶體肯定上漲。

于是,我去掉對象的UIImage屬性,把下載下傳下來的照片通過EGOCache緩存起來,加載cell上的UIImage的時候,直接從緩存裡面取出來就可以了。

代碼如下:

[[EGOCache globalCache] setImage:image forKey:[NSString stringWithFormat:@"EGOImageLoader-%lu", (unsigned long)[[fmObject.path description] hash]] withTimeoutInterval:CacheingTime];
           

再次運作起來,看一下記憶體這一塊:

iOS開發:UITableView加載多張照片導緻記憶體上漲的問題

果然,問題解決了。看來以後給對象加UIImage屬性需謹慎啊!