【发布时间】:2020-11-26 01:54:20
【问题描述】:
关于这个错误有很多问题 (Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0),但它们都是关于用 Swift 编写的代码,而且这是纯 Objective-C。答案似乎大多是关于“unwrapping 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。
【问题讨论】:
-
您能否将崩溃中的堆栈跟踪添加到您的问题中? (程序停止时在调试器控制台中键入“bt”。)
-
我猜你尝试编码的一些对象是 nil?
-
它们不应该为 nil,但它们是 Obj-C 对象的数组,其属性可能为 nil。
-
根据跟踪,问题涉及
-[TempStream encodeWithCoder:],它对 URL 做了一些事情,导致内存问题。不熟悉代码,我无法猜测更多。也许为目标打开 Xcode 的地址清理程序将有助于捕获错误。 -
当使用编码/解码时,我会选择
NSSecureCoding或至少NSCoding协议。文件夹 autorestore 中源代码中的所有接口都没有声明它们是符合的。
标签: objective-c cocoa macos-catalina