NSMutableArray

   為了防止數(shù)組添加nil對象和數(shù)組越界的問題饲宿,通過AOP,用runtime交換系統(tǒng)方法胆描,防止崩潰瘫想。
#import "NSMutableArray+Safe.h"

@implementation NSMutableArray (Safe)

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        id obj = [[self alloc] init];
        [obj swizzleMethod:@selector(addObject:) withMethod:@selector(safeAddObject:)];
        [obj swizzleMethod:@selector(objectAtIndex:) withMethod:@selector(safeObjectAtIndex:)];
        //        [obj swizzleMethod:@selector(insertObject:atIndex:) withMethod:@selector(safeInsertObject:atIndex:)];
        //        [obj swizzleMethod:@selector(removeObjectAtIndex:) withMethod:@selector(safeRemoveObjectAtIndex:)];
        //        [obj swizzleMethod:@selector(replaceObjectAtIndex:withObject:) withMethod:@selector(safeReplaceObjectAtIndex:withObject:)];
    });
}

- (void)safeAddObject:(id)anObject {
    if (anObject) {
        [self safeAddObject:anObject];
    } else {
        NSLog(@"obj is nil");
    }
}

- (id)safeObjectAtIndex:(NSInteger)index {
    if (index < [self count]) {
        return [self safeObjectAtIndex:index];
    } else {
        NSLog(@"index is beyond bounds ");
    }
    return nil;
}

- (void)swizzleMethod:(SEL)origSelector withMethod:(SEL)newSelector {
    Class class = [self class];

    Method originalMethod = class_getInstanceMethod(class, origSelector);
    Method swizzledMethod = class_getInstanceMethod(class, newSelector);

    BOOL didAddMethod = class_addMethod(class,
                                        origSelector,
                                        method_getImplementation(swizzledMethod),
                                        method_getTypeEncoding(swizzledMethod));
    if (didAddMethod) {
        class_replaceMethod(class,
                            newSelector,
                            method_getImplementation(originalMethod),
                            method_getTypeEncoding(originalMethod));
    } else {
        method_exchangeImplementations(originalMethod, swizzledMethod);
    }
}

@end
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市昌讲,隨后出現(xiàn)的幾起案子国夜,更是在濱河造成了極大的恐慌,老刑警劉巖短绸,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件车吹,死亡現(xiàn)場離奇詭異筹裕,居然都是意外死亡,警方通過查閱死者的電腦和手機窄驹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門饶碘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人馒吴,你說我怎么就攤上這事扎运。” “怎么了饮戳?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵豪治,是天一觀的道長。 經(jīng)常有香客問我扯罐,道長负拟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任歹河,我火速辦了婚禮掩浙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘秸歧。我一直安慰自己厨姚,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布键菱。 她就那樣靜靜地躺著谬墙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪经备。 梳的紋絲不亂的頭發(fā)上拭抬,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音侵蒙,去河邊找鬼造虎。 笑死,一個胖子當(dāng)著我的面吹牛纷闺,可吹牛的內(nèi)容都是我干的算凿。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼急但,長吁一口氣:“原來是場噩夢啊……” “哼澎媒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起波桩,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤戒努,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體储玫,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡侍筛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了撒穷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片匣椰。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖端礼,靈堂內(nèi)的尸體忽然破棺而出禽笑,到底是詐尸還是另有隱情,我是刑警寧澤蛤奥,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布佳镜,位于F島的核電站,受9級特大地震影響凡桥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缅刽,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一啊掏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧衰猛,春花似錦迟蜜、人聲如沸酸茴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽救赐。三九已至阿迈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間腰埂,已是汗流浹背飒焦。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留屿笼,地道東北人牺荠。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像驴一,于是被迫代替她去往敵國和親休雌。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

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