Release下iOS访问相册出现"-[NSInvocation setArgument:atIndex:]: index (2) out of bounds“

195 阅读1分钟

一、问题出现

在release下去打开相册时,出现如下crash:

image.png

NSInvocation在访问参数时,越界了。因为是系统调用的此方法,无从下手如何解决

三、分析原因

在xcode上,将编译环境设置成release

image.png 然后,运行起来,发现crash的位置如下:

image.png

这就很奇怪,这只是模态一个相册窗口为什么会crash?

从crash日志看是越界了,怀疑是Runtime交换方法,导致调用了交换的方法;

对比前后两个版本的差异,最近引入了AvoidCrash,它也有交换系统方法。然后去GitHub搜索了一下相关问题,找到了原因:github.com/chenfanfang…

三、问题原因

此错误发生的原因是因为我引入了AvoidCrash进行crash防护,但AvoidCrash有一个位置的代码写的有问题:、

image.png

四、解决问题

将如上代码修改为:

- (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 已经停止更新了,如要使用请慎重。