Objective-C:线程1:encodeWithCoder中的EXC_BAD_INSTRUCTION错误



关于这个错误(Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0(有很多问题,但都是关于用Swift编写的代码,这是纯Objective-C。答案似乎大多是关于";展开nil";这显然是Swift无法做到的,但在Objective-C中似乎没有直接对应的东西。

我以前从未犯过这种错误;升级";到Catalina和Xcode 12(从10开始(。它似乎是随机发生的,几分钟后,在代码的不同位置,但通常在编码NSMutableArrays之一时在encodeWithCoder方法中的某个地方:

- (void)encodeWithCoder:(NSCoder *)encoder {
[encoder encodeInt:serial_version forKey:@"version"];
[encoder encodeObject:program_name forKey:@"program_name"];
[encoder encodeObject:program_info forKey:@"program_info"];
[encoder encodeObject:story_name forKey:@"story_name"];
[encoder encodeObject:story_title forKey:@"story_title"];
[encoder encodeObject:_windows forKey:@"windows"];
[encoder encodeObject:_streams forKey:@"streams"];
...

此处为原始代码。

我想这与线程1:EXC_BAD_INSTRUCTION在swift中保存NSUserDefaults中保存的自定义对象中的NSMutableArray时的错误类似。同样,它工作了一段时间,编码一切都很好,然后突然崩溃。

编辑:在此处堆叠跟踪。

正如Ol Sen在评论中所建议的那样,重写代码以符合NSSecureCoding(基本上用decodeObjectOfClass:forKey替换decodeObjectForKey:(似乎可以解决问题。

相关内容

最新更新