dequeueReusableCellWithIdentifier的理解

原博客地址:http://blog.csdn.net/tongzhitao/article/details/7843897

dequeueReusableCellWithIdentifier,首先我們從字面上理解一下,這個單詞翻譯一下就是“出列的可重用的cell”,其實簡單理解來說就是一個cell池,裏面放的就是你之前創建過的cell。

       iphone重用機制是蘋果爲了實現大量數據顯示而採用的一種節省內存的機制,比如在UITableView和ScrollView 等地方。爲什麼要“可重用”?對於我們的項目來說,內存控制是必不可少的,如果一個tableview有幾百個cell,這個內存消耗是很大的,而且有些cell裏面都有image之類的很佔內存的資源存在的話,那這樣很容易出現memory warning甚至crash掉,這不是我們想要看到的。對此,tableview實現了它自己的管理方法dequeueReusableCellWithIdentifier(ps:我們在某些項目中scrollview來顯示很多張image,在scrollview滑動中也要這樣處理,來避免內存的過度消耗,只不過tableview它已經實現了這個方法,而不用我們自己去寫)。

       reuse機制:當cell需要顯示的時候,從queue裏面找,找到了,設置一下內容,顯示出來滾動界面當有cell被移出屏幕時,把這個cell丟到queue裏面。顯示新的cell時,如果有“相同類型”(identifier)的cell,就從隊列拿一個出來,設置數據,顯示出來。至於queue裏面會有多少cell,這個會自動控制。 

其實也就是在"屏幕顯示的cell數量"是有限的。當屏幕滾動時候,就會調用方法獲取新的cell,而老的cell在屏幕外面就不顯示了。

在使用TableView的時候,代碼應該如何注意

  1. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {  
  2.       
  3.     static NSString *CellIdentifer = @"Cell";     //  0  
  4.       
  5.     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Cell];      //   1  
  6.     if (cell == nil) {  
  7.         cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault  reuseIdentifier:CellIdentifer] autorelease];    //  2  
  8.     }  
  9.       
  10.     // Config your cell  
  11.      cell.textlabel.text = @"XXX";    //  3  
  12.       
  13.     return cell;  
  14. }  

可以這樣理解,cell有一個地方(假設稱爲隊列),專門存放那些生成過的,但是後來由於滾動tableView而隱藏起來的cell,而代碼中語句1就是從隊列中根據標示符取出一個暫時不用的cell,只有cell爲nil,也就是隊列中沒有舊的cell的時候,纔會執行語句2,生成一個新的cell。如果有舊的,就不用執行語句2了,這樣節省資源,算作一種重用吧。在tableView初始化的時候隊列中肯定沒有cell的,所以每個cell生成的時候都會執行一遍2,當屏幕顯示滿了,向上滾動顯示下一行時,就會把第一行隱藏,放到那個隊列中,然後新增加的一行執行語句1的時候,結果就不是nil了,然後,就跳過語句2了,這樣就節約資源了。

當然,上面這樣對於使用系統提供的cell格式是沒有什麼問題,但是如果自己在cell上添加一些控件時,比如一個label,有時就會出現問題。尤其是各個cell的label的文字不相同時。首先這個添加的過程一定要在語句2之後,這樣纔是一次添加,如果放在語句3之後,那麼由於cell的重用可能舊的上面已經有label了,你再添加一個,造成多次添加。其次label的文本值必須保證每次都要重新設置,也就是在語句3之後設置,這樣才能保證每次必須執行。如果放在語句2後面,那麼當使用舊的cell時,仍會保留舊的label文字,這是不對的。
所以是在2後添加,在3後設置,可以在2添加的時候設一個tag值,這樣可以在3處通過tag值獲取控件設置。

插句話:如果用自己做的Cell的話,可以在初始化的時候設置,在賦值的時候設置數據,跟上面的意思一樣

關於語句0,如果每個cell的結構完全相同,那沒問題,就用這一個標識符,但是如果各個cell結構不完全相同,有的有textfield,有的有button,有的有switch,那就不能互相重用了,只能每行用不同的標識符了,可以方便的利用(

NSString *CellIdentifier = [NSString stringWithFormat:@"%@%U_%U",@"Cell",indexPath.section,indexPath.row];

),保證不會重複,多組的再加上組號。那這還有必要用語句2嗎?還是需要的,因爲當自己滾動隱藏,下次再顯示出來的時候,還是可以重用的。標識符完全可以每次用一個新的,但爲了最大限度的重用性,節省資源,纔想了這麼多辦法。

總之,注意添加控件的位置,注意設置控件的位置,注意cell標識符。

發佈了17 篇原創文章 · 獲贊 0 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章