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);
    }];
//创建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{ - ( 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{ return 40 ; } - ( NSInteger )tableView:( UITableView *)tableView numberOfRowsInSection:( NSInteger )section{ return 1 0 ; } - ( UITableViewCell *)tableView:( UITableView *)tableView cellForRowAtIndexPath:( NSIndexPath *)indexPath{
//根据不同的Cell的类型,创建不同的标识符
   
NSString *identifier1= @"MyCouponCell1" ;//标识符1 //根据不同的Cell的类型,创建不同的标识符 NSString *identifier1= @"MyCouponCell1" ;//标识符1
     NSString  *identifier2= @"MyCouponCell2" ;//标识符2 NSString *identifier2= @"MyCouponCell2" ;//标识符2
     NSString  *identifier3= @"MyCouponCell3" ;//标识符3 NSString *identifier3= @"MyCouponCell3" ;//标识符3
NSString *identifier2= @"MyCouponCell2" ;//标识符2 NSString *identifier3= @"MyCouponCell3" ;//标识符3
      MyCouponCell  *cell = [tableView dequeueReusableCellWithIdentifier :identifier1];//根据不同的标识符去复用队列中寻找是否有创建好的Cell
   
if (!cell) { MyCouponCell *cell = [tableView dequeueReusableCellWithIdentifier :identifier1];//根据不同的标识符去复用队列中寻找是否有创建好的Cell if (!cell) {
//复用队列中没有相同标识符的Cell,则去创建
        cell = [[
MyCouponCell alloc ] initWithStyle : UITableViewCellStyleDefault reuseIdentifier :identifier];
        cell.
selectionStyle = UITableViewCellSelectionStyleNone ; //复用队列中没有相同标识符的Cell,则去创建 cell = [[ MyCouponCell alloc ] initWithStyle : UITableViewCellStyleDefault reuseIdentifier :identifier]; cell. selectionStyle = UITableViewCellSelectionStyleNone ;
    } }
   //这里可以刷新Cell数据 //这里可以刷新Cell数据
//Code //Code
    return cell; return cell;
} }

//自定义Cell初始化方法

-( id )initWithStyle:( UITableViewCellStyle )style reuseIdentifier:( NSString *)reuseIdentifier{
   
self =[ super initWithStyle :style reuseIdentifier :reuseIdentifier];
   
if ( self ) {
        [
self createView ];
       
       
    }
   
return self ;
}
-( id )initWithStyle:( UITableViewCellStyle )style reuseIdentifier:( NSString *)reuseIdentifier{ self =[ super initWithStyle :style reuseIdentifier :reuseIdentifier]; if ( self ) { [ self createView ]; } return self ; }
-(void)createView{ -(void)createView{
}
经验分享 程序员 微信小程序 职场和发展