由UITableView緩存機(jī)制引起的崩潰問(wèn)題

最近一直沒(méi)有更新文章,沒(méi)有別的理由就是自己懶蛇数,回頭想想這幾天忙著撕逼幾天下來(lái)扣字過(guò)萬(wàn)松捉,怎么會(huì)沒(méi)有寫一篇總結(jié)文章的功夫呢栅屏?

這里說(shuō)說(shuō)我在開發(fā)中遇到的2個(gè)由于緩存機(jī)制引起的崩潰問(wèn)題:
一啸箫、在二級(jí)頁(yè)面發(fā)送通知更新一級(jí)頁(yè)面數(shù)據(jù)列表并執(zhí)行返回一級(jí)頁(yè)面時(shí)引起崩潰;
二伞芹、使用UISearchController搜索忘苛,全部數(shù)據(jù)和搜索結(jié)果公用一個(gè)UITableView,在開始搜索的時(shí)候引起崩潰唱较。

問(wèn)題一:

 [[NSNotificationCenter defaultCenter]postNotificationName:FINISHARRIVALEQUIP object:nil];
 [self.navigationController popViewControllerAnimated:YES];

起初猜測(cè)是發(fā)送通知又多個(gè)頁(yè)面刷新扎唾,數(shù)據(jù)導(dǎo)致主線程堵塞引起崩潰呢,運(yùn)行代碼后南缓,直接發(fā)現(xiàn)是數(shù)組越界引起崩潰胸遇,因?yàn)樵诎l(fā)送通知后,直接請(qǐng)求數(shù)據(jù)會(huì)先清空數(shù)據(jù)源汉形,網(wǎng)絡(luò)請(qǐng)求還沒(méi)有返回?cái)?shù)據(jù)纸镊,此時(shí)剛好執(zhí)行pop返回到當(dāng)前頁(yè)面倍阐,UITableView會(huì)直接從緩存中拿去數(shù)據(jù),但是數(shù)據(jù)源為空逗威。

解決方法:
1峰搪、在返回會(huì)網(wǎng)絡(luò)請(qǐng)求返回?cái)?shù)據(jù)的時(shí)候再清空數(shù)據(jù)源重新賦值
2、清空數(shù)據(jù)源后凯旭,先執(zhí)行 [self.tableView reloadData]刷新列表概耻,再執(zhí)行網(wǎng)絡(luò)請(qǐng)求

問(wèn)題二

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
   DataSourceItem *item;
    if (!_searchController.active) {
        item = _dataArray[indexPath.row];
    } else {
        item = _searchArray[indexPath.row];
    }
    static NSString *cellIdentifier = @"cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    return cell; 
}

點(diǎn)擊搜索的時(shí)候數(shù)據(jù)源切換為_searchArray,但是tableView依然按照_dataArray緩存拿去數(shù)據(jù)罐呼,從而導(dǎo)致崩潰鞠柄。

解決方法:

- (void)updateSearchResultsForSearchController:(UISearchController *)searchController {
    [self.tableView reloadData];
}

數(shù)組越界問(wèn)題

上面兩種問(wèn)題最終都是由于數(shù)組越界引起的崩潰,可以使用一下方法判斷是否越界:

 if (indexPath.row < _dataArray.count) {
        item = [_dataArray objectAtIndex:indexPath.row];
  }

不是每次都能記得加數(shù)組越界判斷嫉柴,我們可以使用數(shù)組的分類厌杜,在其中內(nèi)部判斷:

@interface NSArray (Util)
 
/*!
 @method objectAtIndexCheck:
 @abstract 檢查是否越界和NSNull如果是返回nil
 @result 返回對(duì)象
 */
- (id)objectAtIndexCheck:(NSUInteger)index;
 
@end
 
#import "NSArray+Util.h"
 
@implementation NSArray (Util)
 
- (id)objectAtIndexCheck:(NSUInteger)index
{
    if (index >= [self count]) {
        return nil;
    }
     
    id value = [self objectAtIndex:index];
    if (value == [NSNull null]) {
        return nil;
    }
    return value;
}
@end

總結(jié)

引起的崩潰兩種情況都是數(shù)據(jù)源改變,UITableView并不知道數(shù)據(jù)源改變差凹,還在緩存中通過(guò)IndexPath.row拿取對(duì)應(yīng)數(shù)組中數(shù)據(jù)期奔, 但此時(shí)數(shù)據(jù)源已改變社裆,就可能會(huì)因?yàn)閿?shù)組越界Carsh碰纬,以上兩種情況都可以通過(guò)在改變數(shù)據(jù)源后及時(shí)刷新UITableView來(lái)解決。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末错沽,一起剝皮案震驚了整個(gè)濱河市谊娇,隨后出現(xiàn)的幾起案子肺孤,更是在濱河造成了極大的恐慌,老刑警劉巖济欢,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赠堵,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡法褥,警方通過(guò)查閱死者的電腦和手機(jī)茫叭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)半等,“玉大人揍愁,你說(shuō)我怎么就攤上這事∩倍” “怎么了莽囤?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)切距。 經(jīng)常有香客問(wèn)我朽缎,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任话肖,我火速辦了婚禮北秽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘狼牺。我一直安慰自己羡儿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布是钥。 她就那樣靜靜地躺著掠归,像睡著了一般。 火紅的嫁衣襯著肌膚如雪悄泥。 梳的紋絲不亂的頭發(fā)上虏冻,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音弹囚,去河邊找鬼厨相。 笑死,一個(gè)胖子當(dāng)著我的面吹牛鸥鹉,可吹牛的內(nèi)容都是我干的蛮穿。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼毁渗,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼践磅!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起灸异,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤府适,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后肺樟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體檐春,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年么伯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了疟暖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡田柔,死狀恐怖誓篱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情凯楔,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布锦募,位于F島的核電站摆屯,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜虐骑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一准验、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧廷没,春花似錦糊饱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至狭归,卻和暖如春夭坪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背过椎。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工室梅, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人疚宇。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓亡鼠,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親敷待。 傳聞我的和親對(duì)象是個(gè)殘疾皇子间涵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法讼撒,內(nèi)部類的語(yǔ)法浑厚,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法根盒,線程的語(yǔ)...
    子非魚_t_閱讀 31,587評(píng)論 18 399
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)钳幅、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,029評(píng)論 4 62
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,516評(píng)論 25 707
  • 最美好的莫過(guò)于有人陪你共風(fēng)月炎滞,在此我要感謝閨蜜阿燎敢艰,感謝有三兩知己足以〔崛花花(閨蜜)和扎(閨蜜)钠导,快來(lái)賞美景。 晚安森瘪。
    想要去非洲的夢(mèng)想閱讀 504評(píng)論 0 1
  • 近期很多網(wǎng)友都關(guān)注到kimi事件牡属,在遺憾之余我們還覺(jué)察出一種“網(wǎng)絡(luò)暴力”《蟛牵總說(shuō)當(dāng)明星要承受很大的壓力逮栅,曝光率...
    比情當(dāng)與閱讀 168評(píng)論 0 0