關(guān)于UITableViewCell重用機(jī)制的理解

  • UITableViewCell的重用機(jī)制體現(xiàn)在-(UITableViewCell)dequeueReusableCellWithIdentifier:(NSString)identifier這個(gè)方法中纪岁,他的基本意思就是在創(chuàng)建cell的時(shí)候?yàn)槊恳粋€(gè)cell都綁定一個(gè)identifier的標(biāo)識笔横。當(dāng)cell從我們的視覺范圍中消失的時(shí)候箩溃,這個(gè)綁定了cell的標(biāo)識就會被放到緩存池中。當(dāng)tableView需要新的cell的時(shí)候锻离,直接先去緩存池中尋找有沒有攜帶identifier的cell,若有的話直接復(fù)用纱兑;沒有的話,才去創(chuàng)建新的cell精肃,并綁定標(biāo)識identifier秤涩。所以從理論上講,倘若一屏最多顯示的cell個(gè)數(shù)為n個(gè)司抱,那么需要攜帶identifier表示的cell最少只需n+1個(gè)筐眷。
  • 當(dāng)然在某些情況下,我們不需要復(fù)用cell习柠,因?yàn)閏ell的復(fù)用在當(dāng)cell的個(gè)數(shù)比較少的情況下匀谣,對于性能的提升幾乎沒有作用,反而有可能會造成數(shù)據(jù)的錯(cuò)亂资溃,這時(shí)候我們不想再使用cell的重用機(jī)制武翎,這時(shí)候該怎么辦呢?可以利用以下幾種方式來解決:
       方法1 將獲得cell的方法從- (UITableViewCell*)dequeueReusableCellWithIdentifier:(NSString*)identifier 換為-(UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath
    
    

重用機(jī)制調(diào)用的就是dequeueReusableCellWithIdentifier這個(gè)方法肉拓,方法的意思就是“出列可重用的cell”,因而只要將它換為cellForRowAtIndexPath(只從要更新的cell的那一行取出cell)梳庆,就可以不使用重用機(jī)制暖途,因而問題就可以得到解決,雖然可能會浪費(fèi)一些空間膏执。

示例代碼:

[plain]

  • (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
    static NSString *CellIdentifier = @"Cell";
    // UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; //改為以下的方法
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; //根據(jù)indexPath準(zhǔn)確地取出一行驻售,而不是從cell重用隊(duì)列中取出
    if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    //...其他代碼
    }

  • (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
    static NSString *CellIdentifier = @"Cell";
    // UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; //改為以下的方法
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; //根據(jù)indexPath準(zhǔn)確地取出一行,而不是從cell重用隊(duì)列中取出
    if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    //...其他代碼
    }

方法2 通過為每個(gè)cell指定不同的重用標(biāo)識符(reuseIdentifier)來解決更米。
重用機(jī)制是根據(jù)相同的標(biāo)識符來重用cell的欺栗,標(biāo)識符不同的cell不能彼此重用。于是我們將每個(gè)cell的標(biāo)識符都設(shè)置為不同征峦,就可以避免不同cell重用的問題了迟几。

示例代碼:

[plain]

  • (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {

    NSString *CellIdentifier = [NSString stringWithFormat:@"Cell%d%d", [indexPath section], [indexPath row]];//以indexPath來唯一確定cell
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; //出列可重用的cell
    if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    //...其他代碼
    }

  • (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {

    NSString *CellIdentifier = [NSString stringWithFormat:@"Cell%d%d", [indexPath section], [indexPath row]];//以indexPath來唯一確定cell
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; //出列可重用的cell
    if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    //...其他代碼
    }

方法3 刪除重用cell的所有子視圖

這個(gè)方法是通過刪除重用的cell的所有子視圖,從而得到一個(gè)沒有特殊格式的cell栏笆,供其他cell重用类腮。

示例代碼:

[plain]

  • (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; //出列可重用的cell
    if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    else
    {
    //刪除cell的所有子視圖
    while ([cell.contentView.subviews lastObject] != nil)
    {
    [(UIView
    )[cell.contentView.subviews lastObject] removeFromSuperview];
    }
    }
    //...其他代碼
    }

-  js中的邏輯與(&&)和邏輯或(||):  
  在js中寫出如下的答案 :
  var a = 2;
  var b = 3;
  var andflag = a && b ;
  var orflag = a || b;
  乍一看,這是一道邏輯或和邏輯與的運(yùn)算題,然而在webostorm中運(yùn)行一下才發(fā)現(xiàn)結(jié)果是,andflag  = 3,orflag = 2;
  具體的執(zhí)行原理如下:

在運(yùn)算過程中,首先js 會將 && 和|| 兩邊的值轉(zhuǎn)成Boolean 類型蛉加,然后再算值 蚜枢,&&運(yùn)算如果返回true,  
則取后面的值针饥,如果|| 返回true,則取前面的值 厂抽, 而其中數(shù)值轉(zhuǎn)換成boolean 的規(guī)則 是:
對象、非零整數(shù)丁眼、非空字符串返回true,
其它為false ;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末筷凤,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子苞七,更是在濱河造成了極大的恐慌嵌施,老刑警劉巖饲化,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異吗伤,居然都是意外死亡吃靠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門足淆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來巢块,“玉大人,你說我怎么就攤上這事巧号∽迳荩” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵丹鸿,是天一觀的道長越走。 經(jīng)常有香客問我,道長靠欢,這世上最難降的妖魔是什么廊敌? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮门怪,結(jié)果婚禮上骡澈,老公的妹妹穿的比我還像新娘。我一直安慰自己掷空,他們只是感情好肋殴,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著坦弟,像睡著了一般护锤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上酿傍,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天蔽豺,我揣著相機(jī)與錄音,去河邊找鬼拧粪。 笑死修陡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的可霎。 我是一名探鬼主播魄鸦,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼癣朗!你這毒婦竟也來了拾因?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绢记,沒想到半個(gè)月后扁达,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蠢熄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年跪解,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片签孔。...
    茶點(diǎn)故事閱讀 38,599評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡叉讥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出饥追,到底是詐尸還是另有隱情图仓,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布但绕,位于F島的核電站救崔,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏捏顺。R本人自食惡果不足惜六孵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望草丧。 院中可真熱鬧狸臣,春花似錦莹桅、人聲如沸昌执。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽懂拾。三九已至,卻和暖如春铐达,著一層夾襖步出監(jiān)牢的瞬間岖赋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工瓮孙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留唐断,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓杭抠,卻偏偏與公主長得像脸甘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子偏灿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容