前段時間發(fā)現(xiàn)bugly上有上報下面這個異常哟绊,而且這種情況只出現(xiàn)在ios 12上
-[CAGradientLayer _clearContents]: unrecognized selector sent to instance
就去網(wǎng)上搜了下這種報錯信息绍傲,發(fā)現(xiàn)好多人說是項目里面有給CAGradientLayer這個類添加了類別舟茶,覆蓋了系統(tǒng)的+layerClass方法训唱,我就在項目里找至壤,沒找到給CAGradientLayer 添加類別的地方。
繼續(xù)搜索脓斩,發(fā)現(xiàn)蘋果開發(fā)者論壇上也有人提問這個問題吗讶,但是沒解決方案照皆。
https://developer.apple.com/forums/thread/115792?answerId=358276022#358276022
我想既然是方法找不到報錯了论寨, 那就可以攔截報錯方法處理就好了绰垂,說干就干昌简。
我就利用OC的RunTime特性谦疾,在CAGradientLayer找不到clearContents這個方法的時候把這個事件交給另一個處理異常的類去處理掉晚顷,完整代碼如下:
CAGradientLayer+RM.h
@interface CAGradientLayer (RM)
@end
CAGradientLayer+RM.m
@interface HandleCrashClass : NSObject
@end
@implementation HandleCrashClass
@end
//處理未找到方法的時候閃退的
@implementation CAGradientLayer (RM)
- (BOOL)resolveClassMethod:(SEL)sel {
? ? return NO;
}
/** 未找到方法的時候在這里返回有實現(xiàn)該方法的實例*/
- (id)forwardingTargetForSelector:(SEL)aSelector {
? ? return nil;
}
/** 沒有返回找到要實現(xiàn)的實例的時候在這里處理*/
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
? ? class_addMethod([HandleCrashClassclass], aSelector, (IMP)missSel,"v@:@");
? ? return [[HandleCrashClass new] methodSignatureForSelector:aSelector];
}
-(void)forwardInvocation:(NSInvocation*)anInvocation {
? ? [anInvocationinvokeWithTarget:[HandleCrashClassnew]];
}
/** 未找到要執(zhí)行的方法的時候就會到這里*/
- (void)doesNotRecognizeSelector:(SEL)aSelector {}
void missSel() {}
@end
上線后發(fā)現(xiàn)這種錯誤后面就再也沒報了,這個閃退問題就算解決了恋沃。