【问题标题】:NSKeyedUnarchiver fails to decode a custom object in swiftNSKeyedUnarchiver 无法快速解码自定义对象
【发布时间】:2014-08-26 17:11:06
【问题描述】:

我正在快速尝试NSCoding 协议的基本实现,但似乎在正确归档对象后无法成功取消归档。

这是我的尝试

import Cocoa

class User: NSObject, NSCoding {
    var name: String

    init(name: String) {
        self.name = name
    }

    init(coder aDecoder: NSCoder!) {
        self.name = aDecoder.decodeObjectForKey("name") as String
    }

    func encodeWithCoder(aCoder: NSCoder!) {
        aCoder.encodeObject(name, forKey: "name")
    }
}

let user = User(name: "Gabriele")
let encodedUser = NSKeyedArchiver.archivedDataWithRootObject(user)
let decodedUser = NSKeyedUnarchiver.unarchiveObjectWithData(encodedUser) as User

在操场上运行它,它会在最后一行启动一个异常。这是详细信息

Execution was interrupted, reason: signal SIGABRT.
The process has been left at the point where it was interrupted, use "thread return -x" to return to the state before expression evaluation.
* thread #1: tid = 0x433bc, 0x00007fff9325e37a libsystem_kernel.dylib`__pthread_kill + 10, queue = 'com.apple.main-thread', stop reason = signal SIGABRT
  * frame #0: 0x00007fff9325e37a libsystem_kernel.dylib`__pthread_kill + 10
    frame #1: 0x00007fff8c3618f7 libsystem_pthread.dylib`pthread_kill + 90
    frame #2: 0x00007fff935b462b libsystem_c.dylib`abort + 129
    frame #3: 0x00007fff8813fa21 libc++abi.dylib`abort_message + 257
    frame #4: 0x00007fff881679d1 libc++abi.dylib`default_terminate_handler() + 267
    frame #5: 0x00007fff8538050d libobjc.A.dylib`_objc_terminate() + 103
    frame #6: 0x00007fff881650a1 libc++abi.dylib`std::__terminate(void (*)()) + 8
    frame #7: 0x00007fff88164b30 libc++abi.dylib`__cxa_throw + 121
    frame #8: 0x00007fff8537c6a7 libobjc.A.dylib`objc_exception_throw + 341
    frame #9: 0x00007fff8ec1962d CoreFoundation`+[NSException raise:format:] + 205
    frame #10: 0x00007fff90dd9382 Foundation`_decodeObjectBinary + 2682
    frame #11: 0x00007fff90dd8796 Foundation`_decodeObject + 278
    frame #12: 0x00007fff90dfe159 Foundation`+[NSKeyedUnarchiver unarchiveObjectWithData:] + 89

编码工作正常,因为encodedUserNSData 的有效实例(准确地说是NSConcreteMutableData)。

这是 Swift 中 Cocoa API 的某种互操作性错误,还是我实现 NSCoding 协议错误?

【问题讨论】:

  • 您的代码似乎在编译后的应用程序中运行良好,因此这可能是 Playground 问题。
  • 在您的类声明之前尝试@objc(User) 以获得未损坏的类名。
  • @David,感谢您的指点,但显然我的问题有所不同。编译器不会崩溃,添加 objc(User) 也无济于事。
  • 这不是操场上的“错误”,而是一个限制。由于类在 Playground 中是动态的,它们不会经过正常的类加载过程,因此它们不会被注册,因此您必须显式注册它们。阅读我链接的整个问题和答案。

标签: swift nskeyedarchiver nscoding nskeyedunarchiver


【解决方案1】:

正如 Martin 在 cmets 中指出的那样,代码在编译后的应用程序中运行良好,所以这绝对是一个操场错误。

大卫,在 cmets 中,建议使用 @objc(User) 来获得一个未损坏的类名,但在这种特定情况下它没有帮助,所以 - 从 beta 2 开始 - 我仍然没有找到使其在操场上工作的解决方法。

【讨论】:

    猜你喜欢
    • 2016-02-15
    • 2020-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    相关资源
    最近更新 更多