查看bugly频丘,好多崩潰由于莫名原因數(shù)組越界或者取超出數(shù)組范圍內(nèi)容,亦或set nil for ?key 了俱病,針對這些增加幾個category來避免直接崩的情況官疲,提升用戶體驗。
一亮隙、NSArray:
創(chuàng)建NSArray的擴展類途凫,NSArray+Extension。重寫load方法溢吻,通過runtime 交換方法來實現(xiàn)维费。
+(void)load
{
? ? staticdispatch_once_tonceToken;
? ? dispatch_once(&onceToken, ^{
? ? ? ? // objectindex
? ? ? ? MethodoldObjectAtIndex =class_getInstanceMethod(objc_getClass("__NSArrayI"),@selector(objectAtIndex:));
? ? ? ? MethodnewObjectAtIndex =class_getInstanceMethod(objc_getClass("__NSArrayI"),@selector(objectAtSafeIndex:));
? ? ? ? method_exchangeImplementations(oldObjectAtIndex, newObjectAtIndex);
? ? ? ? // arr[4]
? ? ? ? MethodoldObjectAtIndex1 =class_getInstanceMethod(objc_getClass("__NSArrayI"),@selector(objectAtIndexedSubscript:));
? ? ? ? MethodnewObjectAtIndex1 =? class_getInstanceMethod(objc_getClass("__NSArrayI"),@selector(safeobjectAtIndexedSubscript:));
? ? ? ? method_exchangeImplementations(oldObjectAtIndex1, newObjectAtIndex1);
? ? });
}
因為,數(shù)組取值可以用objectindex 和 arr[index]兩種方式,所以需要這兩種方法都需要替換犀盟。
- (id)objectAtSafeIndex:(NSUInteger)index
{
? ? if(index >self.count-1|| !self.count) {
? ? ? ? @try{
? ? ? ? ? ? return[selfobjectAtSafeIndex:index];
? ? ? ? }
? ? ? ? @catch(NSException *exception) {
? ? ? ? ? ? NSLog(@"exception: %@", exception.reason);
? ? ? ? ? ? returnnil;
? ? ? ? }
? ? }else{
? ? ? ? return[selfobjectAtSafeIndex:index];
? ? }
}
- (instancetype)safeobjectAtIndexedSubscript:(NSUInteger)index{
? ? if(index > (self.count-1)) {// 數(shù)組越界
? ? ? ? returnnil;
? ? }else{// 沒有越界
? ? ? ? return [self safeobjectAtIndexedSubscript:index];
? ? }
}
二噪漾、NSMutableArray+Extension。且蓬。欣硼。同理,可變數(shù)組如下:
+(void)load? //第一次加載內(nèi)存的時候會自動調(diào)用恶阴。
{
? ? staticdispatch_once_tonceToken;
? ? dispatch_once(&onceToken, ^{
? ? ? ? //addObject
? ? ? ? MethodorginalMethod =class_getInstanceMethod(NSClassFromString(@"__NSArrayM"),@selector(addObject:));
? ? ? ? MethodnewMethod =class_getInstanceMethod(NSClassFromString(@"__NSArrayM"),@selector(gp_addobjc:));
? ? ? ? method_exchangeImplementations(orginalMethod, newMethod);
? ? ? ? //替換objectAtIndex方法
? ? ? ? MethodoldMutableObjectAtIndex =class_getInstanceMethod(objc_getClass("__NSArrayM"),@selector(objectAtIndex:));
? ? ? ? MethodnewMutableObjectAtIndex =? class_getInstanceMethod(objc_getClass("__NSArrayM"),@selector(mutableObjectAtSafeIndex:));
? ? ? ? method_exchangeImplementations(oldMutableObjectAtIndex, newMutableObjectAtIndex);
? ? ? ? //替換arr[4]方法
? ? ? ? MethodoldMutableObjectAtIndex1 =class_getInstanceMethod(objc_getClass("__NSArrayM"),@selector(objectAtIndexedSubscript:));
? ? ? ? MethodnewMutableObjectAtIndex1 =? class_getInstanceMethod(objc_getClass("__NSArrayM"),@selector(safeobjectAtIndexedSubscript:));
? ? ? ? method_exchangeImplementations(oldMutableObjectAtIndex1, newMutableObjectAtIndex1);
? ? });
}
//addobject
-(void)gp_addobjc:(id)object
{
? ? if(object !=nil) {
? ? ? ? [self gp_addobjc:object];//此時? 方法交換诈胜,所以不能在這寫addobject。若這樣的話冯事,會造成死循環(huán)焦匈。
? ? }
}
//objectAtIndex
- (id)mutableObjectAtSafeIndex:(NSUInteger)index
{
? ? if(index >self.count-1|| !self.count) {
? ? ? ? @try{
? ? ? ? ? ? return [self mutableObjectAtSafeIndex:index];
? ? ? ? }
? ? ? ? @catch(NSException *exception) {
? ? ? ? ? ? NSLog(@"exception: %@", exception.reason);
? ? ? ? ? ? returnnil;
? ? ? ? }
? ? }else{
? ? ? ? return [self mutableObjectAtSafeIndex:index];
? ? }
}
//aar[index]
- (instancetype)safeobjectAtIndexedSubscript:(NSUInteger)index{
? ? if(index > (self.count-1)) {// 數(shù)組越界
? ? ? ? returnnil;
? ? }else{// 沒有越界
? ? ? ? return [self safeobjectAtIndexedSubscript:index];
? ? }
}