防止數(shù)組越界崩潰

1. 數(shù)組越界 訪問為空是我們的app的一大元兇,當(dāng)訪問數(shù)組經(jīng)常會(huì)訪問為空,這是就會(huì)拋出異常導(dǎo)致app閃退,有時(shí)當(dāng)我們測試時(shí)數(shù)據(jù)是好的,但是在上線以后有可能后臺(tái)修改數(shù)據(jù)有問題,導(dǎo)致前段訪問數(shù)據(jù)時(shí)造成訪問數(shù)組訪問為空越界,
2. 可變數(shù)組添加元素是,元素不能為空,當(dāng)為空時(shí)將發(fā)出異常,導(dǎo)致app崩潰閃退

下面我將介紹使用runtime替換系統(tǒng)的方法防止數(shù)組增刪改查出現(xiàn)問題直接崩潰

首先創(chuàng)建一個(gè)類目 繼承自NSMutableArray

@interface NSMutableArray (categary)

導(dǎo)入#import <objc/runtime.h>

使用系統(tǒng)的類方法+load{}

這里先介紹load方法+load方法是一個(gè)類方法,應(yīng)用啟動(dòng)的時(shí)候加載所有的類,這時(shí)就會(huì)調(diào)用類方法

load方法被添加到runtime時(shí)開始執(zhí)行 父類首先執(zhí)行,之后是子類最后才到categary 又因?yàn)槭侵苯荧@取函數(shù)指針來執(zhí)行,不會(huì)像 objc_msgSend 一樣會(huì)有方法查找的過程

+ (void)load
    {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
   
        Method newMethod = class_getClassMethod([self class], @selector(cq_objectAtIndex:));
        Method method = class_getClassMethod([self class], @selector(objectAtIndex:));
    
        //交換系統(tǒng)的取數(shù)組元素的方法
       method_exchangeImplementations(newMethod, method);
        
        
        Method addNewMethod = class_getClassMethod([self class], @selector(cq_addObject:));
        Method addmethod = class_getClassMethod([self class], @selector(addObject:));

       //交換系統(tǒng)添加元素到數(shù)組的方法        
    method_exchangeImplementations(addNewMethod, addmethod);
        
        
        Method removeNewMethod = class_getClassMethod([self class], @selector(cq_safeRemoveObject:));
        Method removemethod = class_getClassMethod([self class], @selector(removeObject:));

    //交換系統(tǒng)移除數(shù)組元素的方法      
  method_exchangeImplementations(removeNewMethod, removemethod);
        
    });
    }


這里使用GCD的單例表示是只創(chuàng)建一次,因?yàn)槊看晤愓{(diào)用的時(shí)候都會(huì)加載load類方法

 //取值
- (id)cq_objectAtIndex:(NSUInteger)index
{
    if (self.count == 0) {
        NSLog(@"%s mutArray None Object",__func__);
        return nil;
    }
    
   if (index > self.count) {
        NSLog(@"%s index out of mutArrayCount",__func__);
        
        return nil;
    }
    
    return [self cq_objectAtIndex:index];
    
}
//向數(shù)組添加元素
- (void)cq_addObject:(id)object
{`
    if (object == nil) {
        NSLog(@"%s can add nil object into NSMutableArray", __FUNCTION__);
    } else {
        [self cq_addObject:object];
    }
}
//移除指定下標(biāo)元素
- (void)cq_RemoveObjectAtIndex:(NSUInteger)index {
    if (self.count <= 0) {
        NSLog(@"%s can't get any object from an empty array", __FUNCTION__);
        return;
    }
    
    if (index >= self.count) {
        NSLog(@"%s index out of bound", __FUNCTION__);
        return;
    }
    
    [self cq_RemoveObjectAtIndex:index];
}
//插入元素到指定下標(biāo)位置
- (void)cq_insertObject:(id)anObject atIndex:(NSUInteger)index {
    if (anObject == nil) {
        NSLog(@"%s can't insert nil into NSMutableArray", __FUNCTION__);
    } else if (index > self.count) {
        NSLog(@"%s index is invalid", __FUNCTION__);
    } else {
        [self cq_insertObject:anObject atIndex:index];
    }
}
//移除特定元素
- (void)cq_safeRemoveObject:(id)obj {
    if (obj == nil) {
        NSLog(@"%s call -removeObject:, but argument obj is nil", __FUNCTION__);
        return;
    }
    
    [self cq_safeRemoveObject:obj];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末礁击,一起剝皮案震驚了整個(gè)濱河市迹恐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌塘安,老刑警劉巖糠涛,帶你破解...
    沈念sama閱讀 212,080評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異兼犯,居然都是意外死亡忍捡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門切黔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來砸脊,“玉大人,你說我怎么就攤上這事纬霞×韫。” “怎么了?”我有些...
    開封第一講書人閱讀 157,630評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵险领,是天一觀的道長侨舆。 經(jīng)常有香客問我,道長绢陌,這世上最難降的妖魔是什么挨下? 我笑而不...
    開封第一講書人閱讀 56,554評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮脐湾,結(jié)果婚禮上臭笆,老公的妹妹穿的比我還像新娘。我一直安慰自己秤掌,他們只是感情好愁铺,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,662評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著闻鉴,像睡著了一般茵乱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上孟岛,一...
    開封第一講書人閱讀 49,856評(píng)論 1 290
  • 那天瓶竭,我揣著相機(jī)與錄音督勺,去河邊找鬼。 笑死斤贰,一個(gè)胖子當(dāng)著我的面吹牛智哀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播荧恍,決...
    沈念sama閱讀 39,014評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼瓷叫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了送巡?” 一聲冷哼從身側(cè)響起摹菠,我...
    開封第一講書人閱讀 37,752評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎骗爆,沒想到半個(gè)月后辨嗽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,212評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡淮腾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,541評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了屉佳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谷朝。...
    茶點(diǎn)故事閱讀 38,687評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖武花,靈堂內(nèi)的尸體忽然破棺而出圆凰,到底是詐尸還是另有隱情,我是刑警寧澤体箕,帶...
    沈念sama閱讀 34,347評(píng)論 4 331
  • 正文 年R本政府宣布专钉,位于F島的核電站,受9級(jí)特大地震影響累铅,放射性物質(zhì)發(fā)生泄漏跃须。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,973評(píng)論 3 315
  • 文/蒙蒙 一娃兽、第九天 我趴在偏房一處隱蔽的房頂上張望菇民。 院中可真熱鬧,春花似錦投储、人聲如沸第练。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽娇掏。三九已至,卻和暖如春勋眯,著一層夾襖步出監(jiān)牢的瞬間婴梧,已是汗流浹背下梢。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留志秃,地道東北人怔球。 一個(gè)月前我還...
    沈念sama閱讀 46,406評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像浮还,于是被迫代替她去往敵國和親竟坛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,576評(píng)論 2 349

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