iOS NSException與crash處理-避免crash

利用 分類(category) + runtime + 異常的捕獲 來防止Foundation一些常用方法使用不當(dāng)而導(dǎo)致的崩潰。其原理就是利用category、runtime來交換兩個方法,并且在方法中捕獲異常進(jìn)行相應(yīng)的處理。

  • 1、通過category給類添加方法用來替換掉原本存在潛在崩潰的方法。
  • 2、利用runtime方法交換技術(shù),將系統(tǒng)方法替換成我們給類添加的新方法。
  • 3、利用異常的捕獲來防止程序的崩潰,并且進(jìn)行相應(yīng)的處理
#import "NSMutableArray+Extension.h"

#import <objc/runtime.h>

@implementation NSMutableArray (Extension)

+ (void)load {
    
    Class arrayMClass = NSClassFromString(@"__NSArrayM");
    
    //獲取系統(tǒng)的添加元素的方法
    Method addObject = class_getInstanceMethod(arrayMClass, @selector(addObject:));
    
    //獲取我們自定義添加元素的方法
    Method avoidCrashAddObject = class_getInstanceMethod(arrayMClass, @selector(avoidCrashAddObject:));
    
    //將兩個方法進(jìn)行交換
    //當(dāng)你調(diào)用addObject,其實(shí)就是調(diào)用avoidCrashAddObject
    //當(dāng)你調(diào)用avoidCrashAddObject,其實(shí)就是調(diào)用addObject
    method_exchangeImplementations(addObject, avoidCrashAddObject);
}

- (void)avoidCrashAddObject:(id)anObject {
    
    @try {
        [self avoidCrashAddObject:anObject];//其實(shí)就是調(diào)用addObject
    }
    @catch (NSException *exception) {
        
        //能來到這里,說明可變數(shù)組添加元素的代碼有問題
        //你可以在這里進(jìn)行相應(yīng)的操作處理
        
        NSLog(@"異常名稱:%@   異常原因:%@",exception.name, exception.reason);
    }
    @finally {
        //在這里的代碼一定會執(zhí)行,你也可以進(jìn)行相應(yīng)的操作
    }
}

@end

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容