天天看點

ios 關于tableview的複用問題,避免假複用

自從開始做ios開發,自己開發了很多用戶端,也看到很多别人寫的程式,發現很多人在做程式的時候走入了很多誤區,比如tableview的複用,tableview的複用是為了解決大量資料的記憶體管理問題,優化軟體的運作品質,但是因為問題隻會影響到運作的品質問題,對于實作功能沒有影響,是以這類問題在開發的時候很難被察覺,是以想提高軟體品質的童鞋可以試試了解一下這個問題的優化方法。希望對大家有所幫助

了解軟體的運作機理,以不變應萬變:

假設第一個頁面會顯示8個Cell,是以需要建立8個Cell,每一個Cell都是獨立的。建立完成這8個Cell以後,複用隊列為空。然後當tableview開始滑動的時候,當第一個cell消失在螢幕上的時候,cell會被添加至複用隊列中,此時複用隊列為1個,此時這個複用隊列中的cell的辨別符為Cell自身的辨別符,cell和辨別符的關系有點類似字典,辨別符對應Cell,通過辨別符尋找Cell,當第二個Cell消失在螢幕中的時候,程式首先會根據第二個的Cell去複用隊列尋找是否有和第二個辨別符相同的辨別符,如果有,則Cell被釋放,複用隊列不變,如果沒有,則複用隊列中添加第二個Cell,複用隊列增加1個對象,以此類推...

同理,當第九個Cell需要在螢幕中出現的話,程式會從複用隊列中根據辨別符尋找有沒有對應的Cell,如果沒有,則會重新建立,如果有,則直接引用,不需要建立。

代碼執行:

    //建立tableview

    tableview=[[UITableViewalloc]init];

    tableview.delegate=self;

    tableview.dataSource=self;

    tableview.tableFooterView=[UIViewnew];

    [self.viewaddSubview:tableview];

    [tableview mas_makeConstraints:^(MASConstraintMaker*make) {

        make.edges.equalTo(self.view);

    }];

- ( CGFloat )tableView:( UITableView *)tableView heightForRowAtIndexPath:( NSIndexPath *)indexPath{     return 40 ;

}

- ( NSInteger )tableView:( UITableView *)tableView numberOfRowsInSection:( NSInteger )section{

    return 1 0 ;

}

- ( UITableViewCell *)tableView:( UITableView *)tableView cellForRowAtIndexPath:( NSIndexPath *)indexPath{ //根據不同的Cell的類型,建立不同的辨別符

    NSString *identifier1= @"MyCouponCell1" ;//辨別符1      NSString  *identifier2= @"MyCouponCell2" ;//辨別符2      NSString  *identifier3= @"MyCouponCell3" ;//辨別符3       MyCouponCell  *cell = [tableView dequeueReusableCellWithIdentifier :identifier1];//根據不同的辨別符去複用隊列中尋找是否有建立好的Cell

    if (!cell) { //複用隊列中沒有相同辨別符的Cell,則去建立

        cell = [[ MyCouponCell alloc ] initWithStyle : UITableViewCellStyleDefault reuseIdentifier :identifier];

        cell. selectionStyle = UITableViewCellSelectionStyleNone ;     }

   //這裡可以重新整理Cell資料 //Code

    return cell; }

//自定義Cell初始化方法

-( id )initWithStyle:( UITableViewCellStyle )style reuseIdentifier:( NSString *)reuseIdentifier{

    self =[ super initWithStyle :style reuseIdentifier :reuseIdentifier];

    if ( self ) {

        [ self createView ];

    }

    return self ;

} -(void)createView{

}

至于怎麼區分cell是不是需要使用同一種辨別符,作者這裡一般根據Cell中的控件是否隻是需要重新整理資料,而裡面的控件都是一樣的來區分,現在還沒有理論支援,如果大家有理論解釋的話也可以向作者回報,作者郵箱:[email protected]