自从开始做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=[[UITableViewalloc]init];
tableview.delegate=self;
tableview.dataSource=self;
tableview.tableFooterView=[UIViewnew];
[self.viewaddSubview:tableview];
[tableview mas_makeConstraints:^(MASConstraintMaker*make) {
make.edges.equalTo(self.view);
}];
}
- ( NSInteger )tableView:( UITableView *)tableView numberOfRowsInSection:( NSInteger )section{
return 1 0 ;
}
- ( UITableViewCell *)tableView:( UITableView *)tableView cellForRowAtIndexPath:( NSIndexPath *)indexPath{
NSString *identifier1= @"MyCouponCell1" ;//标识符1
if (!cell) {
cell = [[ MyCouponCell alloc ] initWithStyle : UITableViewCellStyleDefault reuseIdentifier :identifier];
cell. selectionStyle = UITableViewCellSelectionStyleNone ;
//自定义Cell初始化方法
self =[ super initWithStyle :style reuseIdentifier :reuseIdentifier];
if ( self ) {
[ self createView ];
}
return self ;
}
至于怎么区分cell是不是需要使用同一种标识符,作者这里一般根据Cell中的控件是否只是需要刷新数据,而里面的控件都是一样的来区分,现在还没有理论支持,如果大家有理论解释的话也可以向作者反馈,作者邮箱:1456661057@qq.com