UITableView是在iOS開發中最常用的控件之一。我的第一篇學習心得獻給它了

UITableView是由一行一行的UITableViewCell構成的。
首先想這樣一個問題:現在用UITableView去做一個聯系人列表,如果我有10個100個聯系人,那我可以建10個100 ? ?個UITableViewCell,但是如果有一千一萬個呢,創建這么多Cell是不是會很影響手機的性能并且造成不好的用戶體驗呢?
因此,蘋果官方給出的解決方案是采用復用機制。
什么是復用機制?簡單點回答:如果有我就用,沒有我就創建。就比如吃飯需要用筷子,如果現在我家里有筷子當然我就用家里的筷子,如果家里沒有筷子我就去買筷子。買了筷子當然不會用一次,買了之后下次就是用買的筷子。當然這個例子不是特別恰當,領會精神為主。說不用筷子用勺子或者用一次性筷子的我不想看見你們。
來看看UITableViewCell創建的標準代碼:
static NSString *CellTableIdentifier = @"only";
? ? UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellTableIdentifier];
? ? if (cell == nil) {
? ? cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault?reuseIdentifier:CellTableIdentifier] autorelease];
}
? ? UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellTableIdentifier];
? ? if (cell == nil) {
? ? cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault?reuseIdentifier:CellTableIdentifier] autorelease];
}
我們這樣來理解:
如果有100行cell,根據cell高度和屏幕高度,我們每次只能顯示10行cell,我們在滑動屏幕時,我們已經創建的cell會被劃沒看不見,但是它們并沒有消失,而是相當于進入一個復用的隊列。然后當需要新建cell的時候,先到這個復用隊列里看看,如果有的話,我們就去復用隊列里取出這個cell使用,如果沒有的話我們才去真正的創建一個,這樣就避免了多次重復的創建UITableViewCell,對內存空間的使用起到了很好的控制作用。
static NSString *CellTableIdentifier = @"only";
這行代碼定義了一個靜態的字符串,用來當做cell的標識,static?關鍵字保證了唯一性
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellTableIdentifier];
接下來就該創建cell了。根據我們的邏輯,如果復用隊列中有可用的cell的話,我們是優先使用的,因此,我們首先要去復用隊列中尋找是否有我們需要的可用的cell,所以當前的tableView調用dequeueReusableCellWithIdentifier方法,參數就是我們定義的標識。如果復用隊列中有可用的cell,那么返回值就是這個可用的cell,如果沒有的話返回的是個nil。
第一次我們什么都沒有, 所以必然返回的是nil,因而進入到if的判斷條件中,在這里,才是我們真正的的第一次去創建cell。
cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault?reuseIdentifier:CellTableIdentifier] autorelease];
可以看到,我們在內存中為cell開辟了新的空間,生成新的cell,同時為cell附上它獨有的標識符,在它進入到復用隊列里以后,我們通過標識符來尋找我們所需要的cell。