Objective-C: 线程 1:EXC_BAD_INSTRUCTION 在 encodeWithCoder 中出错

Objective-C: Thread 1:EXC_BAD_INSTRUCTION error in encodeWithCoder

有很多关于这个错误的问题(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"];

...

原码here.

我想它类似于 Thread 1:EXC_BAD_INSTRUCTION error when saving NSMutableArray In custom object saved in NSUserDefaults in swift 。同样,它工作了一段时间,编码一切正常,然后突然崩溃。

编辑:堆栈跟踪 here

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