iOS开发之循环利用带来的问题
在iOS开发中,考虑到APP性能的问题,很多时候都会涉及到控件的循环利用问题,最经典的就是tableView中的cell,在cell循环利用的过程中,cell上面的数据不可避免的也会被循环利用,幸运的是我们可以可以在:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
LXBMessageCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
cell.news = self.news[indexPath.row];
return cell;
}
方法中解决这种问题,最根本的原因就是每个cell "一一对应" 一个模型,当cell被循环利用的时候,传给cell的是不同的模型,cell显示的就是不同的数据,所以此时cell的循环利用不会有数据的冗余问题.
当我们通过xib的形式自定义cell的时候,往往会向cell中添加很多的控件,有时我们可能要控制某些控件的显示与隐藏,也可能要防止某些旧数据被循环利用,但是呢在原始模型中又还不存在与cell中那些控件(有冗余数据的那个控件)一一对应的那种数据,所以我们没有办法通过原始模型去一一对应我们自定义的cell,这个时候不处理的话那些控件就会有数据的冗余问题
解决办法:
最关键的还是模型,抓住一点,要避免控件的循环利用带来的数据冗余问题,就要保证每一个控件即将显示的数据是不一样的,是唯一的,其实就是保证cell与模型的一一对应关系
控件的循环利用带来的控件状态的冗余问题(比如到底是让他显示还是隐藏的问题)主要有两种解决方案
一般情况下,首先在xib中将他的hidden为YES,以后在合适的地方再修改他的状态.
if(到了该显示的时候) {
控件.hidden = NO;
} else {
控件.hidden = YES;
}```
- 最OOP的解决办法,我们可以在模型添加一个BOOL辅助属性,用于记录这个控件的状态,由于BOOL属性的默认值是NO,恰好可以满足我们的需求,
我们就可以在恰当的时候去设置这个BOOL属性值,比如:
```objc
@property (nonatomic,assign,getter=isSina_v) BOOL sina_v;
if(...) {
self.sina_v = YES;
} else {
self.sina_v = NO;
}
控件.hidden = 模型.isSina_v;
- 控件的循环利用带来的数据冗余问题
- 针对这样的问题一般可以通过在对应的模型中添加辅助属性来解决,以后即使把这个cell循环利用到了其他地方,由于cell与模型的一一对应关系,其他地方的cell中的那个控件是无法取出这个数据的