iOS開發(fā)之循環(huán)利用帶來的問題
在iOS開發(fā)中,考慮到APP性能的問題,很多時候都會涉及到控件的循環(huán)利用問題,最經(jīng)典的就是tableView中的cell,在cell循環(huán)利用的過程中,cell上面的數(shù)據(jù)不可避免的也會被循環(huán)利用,幸運的是我們可以可以在:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
LXBMessageCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
cell.news = self.news[indexPath.row];
return cell;
}
方法中解決這種問題,最根本的原因就是每個cell "一一對應" 一個模型,當cell被循環(huán)利用的時候,傳給cell的是不同的模型,cell顯示的就是不同的數(shù)據(jù),所以此時cell的循環(huán)利用不會有數(shù)據(jù)的冗余問題.
當我們通過xib的形式自定義cell的時候,往往會向cell中添加很多的控件,有時我們可能要控制某些控件的顯示與隱藏,也可能要防止某些舊數(shù)據(jù)被循環(huán)利用,但是呢在原始模型中又還不存在與cell中那些控件(有冗余數(shù)據(jù)的那個控件)一一對應的那種數(shù)據(jù),所以我們沒有辦法通過原始模型去一一對應我們自定義的cell,這個時候不處理的話那些控件就會有數(shù)據(jù)的冗余問題
解決辦法:
最關鍵的還是模型,抓住一點,要避免控件的循環(huán)利用帶來的數(shù)據(jù)冗余問題,就要保證每一個控件即將顯示的數(shù)據(jù)是不一樣的,是唯一的,其實就是保證cell與模型的一一對應關系
控件的循環(huán)利用帶來的控件狀態(tài)的冗余問題(比如到底是讓他顯示還是隱藏的問題)主要有兩種解決方案
一般情況下,首先在xib中將他的hidden為YES,以后在合適的地方再修改他的狀態(tài).
if(到了該顯示的時候) {
控件.hidden = NO;
} else {
控件.hidden = YES;
}```
- 最OOP的解決辦法,我們可以在模型添加一個BOOL輔助屬性,用于記錄這個控件的狀態(tài),由于BOOL屬性的默認值是NO,恰好可以滿足我們的需求,
我們就可以在恰當?shù)臅r候去設置這個BOOL屬性值,比如:
```objc
@property (nonatomic,assign,getter=isSina_v) BOOL sina_v;
if(...) {
self.sina_v = YES;
} else {
self.sina_v = NO;
}
控件.hidden = 模型.isSina_v;
- 控件的循環(huán)利用帶來的數(shù)據(jù)冗余問題
- 針對這樣的問題一般可以通過在對應的模型中添加輔助屬性來解決,以后即使把這個cell循環(huán)利用到了其他地方,由于cell與模型的一一對應關系,其他地方的cell中的那個控件是無法取出這個數(shù)據(jù)的