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
)似乎可以解决问题。
有很多关于这个错误的问题(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
)似乎可以解决问题。