一、问题出现
在release下去打开相册时,出现如下crash:
NSInvocation在访问参数时,越界了。因为是系统调用的此方法,无从下手如何解决
三、分析原因
在xcode上,将编译环境设置成release
然后,运行起来,发现crash的位置如下:
这就很奇怪,这只是模态一个相册窗口为什么会crash?
从crash日志看是越界了,怀疑是Runtime交换方法,导致调用了交换的方法;
对比前后两个版本的差异,最近引入了AvoidCrash,它也有交换系统方法。然后去GitHub搜索了一下相关问题,找到了原因:github.com/chenfanfang…
三、问题原因
此错误发生的原因是因为我引入了AvoidCrash进行crash防护,但AvoidCrash有一个位置的代码写的有问题:、
四、解决问题
将如上代码修改为:
- (NSMethodSignature *)avoidCrashMethodSignatureForSelector:(SEL)aSelector {
NSMethodSignature *ms = [self avoidCrashMethodSignatureForSelector:aSelector];
BOOL flag = NO;
if (ms == nil) {
for (NSString *classStr in noneSelClassStrings) {
if ([self isKindOfClass:NSClassFromString(classStr)]) {
ms = [AvoidCrashStubProxy instanceMethodSignatureForSelector:@selector(proxyMethod)];
flag = YES;
break;
}
}
if (flag == NO) {
NSString *selfClass = NSStringFromClass([self class]);
for (NSString *classStrPrefix in noneSelClassStringPrefixs) {
if ([selfClass hasPrefix:classStrPrefix]) {
ms = [AvoidCrashStubProxy instanceMethodSignatureForSelector:@selector(proxyMethod)];
}
}
}
}
return ms;
}
如此即可解决问题
五、总结
AvoidCrash 已经停止更新了,如要使用请慎重。