利用 分類(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