【问题标题】:Objective-C: Thread 1:EXC_BAD_INSTRUCTION error in encodeWithCoderObjective-C:线程 1:encodeWithCoder 中的 EXC_BAD_INSTRUCTION 错误
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多