UITableViewCell重用機制

躍然發表於2014-07-31


       UITableView是iOS開發中使用頻率非常高的一個控制元件,它常被用來展示資訊列表,雖然資訊資料可能很多,但UITableView消耗的資源卻並不會隨著展示資訊的增多而變大,這都要得益於UITableViewCell的重用機制,重用機制:顧名思義,就是重複利用資源的機制。下面通過一些程式碼來看下通常我們建立UITableViewCell的方式

- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath

{

    static NSString *cellIdentifier =@"NormalCell";

    UITableViewCell *cell = [tableViewdequeueReusableCellWithIdentifier: cellIdentifier];

    if (!cell) {

        cell = [[UITableViewCellalloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier: cellIdentifier];

    }

    //處理邏輯

    return cell;

}

    如上所示,通常我們會呼叫UITableViewCell*cell = [tableView dequeueReusableCellWithIdentifier: cellIdentifier];語句來獲取標識為@"NormalCell"的可重用的cell,如果有標識為@"NormalCell"的cell,則返回一個cell;否則返回nil。若上面語句的返回值為nil,我們就需要建立一個新cell。上面這種獲取cell的方式即是UITableViewCell的重用機制。舉個形象例子:當前的UITableView一次最多可顯示8個cell,我們有100個cell需要顯示出來,那麼當UITableView初始化時顯示的是1-8的cell,這時候沒有可重用的cell,所以每個cell都需要新建,當我們把UITableView向上拖動,這時候第1個cell尚未完全離開可見檢視,第9個cell需要顯示部分,這時也是沒有可重用的cell,所以第9個cell也是需要新建的,當第1個cell完全離開可見檢視後即被回收回去標記為可重用,現在當需要顯示第10個cell時即可獲取到可重用的cell,所以第10個cell是不需要新建的,它使用的即是被回收的第1個cell,後面的以此類推,所以展示100個cell只需要新建9個cell就可以了。

結合網路資料及iOS的SDK可以推測UITableViewCell的重用機制是這樣實現的:

    在UITableView中應該有一個可變字典來儲存可重用的cell:NSMutableDictionary*reusableTableCells;在UITableView剛初始化的時候reusableTableCells中的內容為空,當有cell離開可見檢視時,系統就會根據cell的可重用標識把cell儲存到reusableTableCells中,實現方式類似如下程式碼:

-(void)addReusebleCell:(UITableViewCell *)cell

{                                                                      

    NSString *reuseIdentifier =cell.reuseIdentifier;

    NSMutableSet *reuseCellSet = [reusableTableCellsobjectForKey:reuseIdentifier];

    if (!reuseCellSet) {

        reuseCellSet = [[NSMutableSetalloc]init];

    }

    [reuseCellSet addObject:cell];

    [reusableTableCells setObject:reuseCellSetforKey:reuseIdentifier];

}

    獲取可重用cell的方法- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier的實現方式類似如下程式碼:

-(id)dequeueReusableCellWithIdentifier:(NSString *)identifier

{

    NSMutableSet *reuseCellSet =[reusableTableCells objectForKey:identifier];

    if (reuseCellSet.count == 0) {

        return nil;

    }

    id anyObject = [reuseCellSet anyObject];

    [reuseCellSet removeObject:anyObject];

    return anyObject;

}

至此,UITableViewCell的重用機制的講解完畢。

相關文章