【问题标题】:Got Unrecognized selector -replacementObjectForKeyedArchiver: crash when implementing NSCoding in SwiftGot Unrecognized selector -replacementObjectForKeyedArchiver: 在 Swift 中实现 NSCoding 时崩溃
【发布时间】:2014-09-12 09:56:46
【问题描述】:

我创建了一个符合 NSCoding 的 Swift 类。 (Xcode 6 通用,Swift 1.0)

import Foundation

private var nextNonce = 1000

class Command: NSCoding {

    let nonce: Int
    let string: String!

    init(string: String) {
        self.nonce = nextNonce++
        self.string = string
    }

    required init(coder aDecoder: NSCoder) {
        nonce = aDecoder.decodeIntegerForKey("nonce")
        string = aDecoder.decodeObjectForKey("string") as String
    }

    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeInteger(nonce, forKey: "nonce")
        aCoder.encodeObject(string, forKey: "string")
    }
}

但是当我打电话时...

let data = NSKeyedArchiver.archivedDataWithRootObject(cmd);

它崩溃给我这个错误。

2014-09-12 16:30:00.463 MyApp[30078:60b] *** NSForwarding: warning: object 0x7a04ac70 of class '_TtC8MyApp7Command' does not implement methodSignatureForSelector: -- trouble ahead
Unrecognized selector -[MyApp.Command replacementObjectForKeyedArchiver:]

我该怎么办?

【问题讨论】:

  • @noundla 不,您链接中的答案不适用于我的问题。我尝试了两种解决方案。 1)将@objc 添加到我的Command 类和NSCoding 方法仍然给我同样的错误。 2) 添加NSObject 和我的回答一样。下次你最好先试试。
  • 我昨天遇到了同样的问题,该解决方案对我有用。我同时使用了 1 和 2 解决方案来解决问题。
  • @noundla 很奇怪。可能只是因为我们的问题不同。你的是关于performSelector:,但我的是关于 NSCoding 协议。

标签: ios swift xcode6 nscoding


【解决方案1】:

虽然 Swift 类可以在没有继承的情况下工作,但要使用NSCoding,您必须NSObject 继承

class Command: NSObject, NSCoding {
    ...
}

太糟糕了,编译器错误信息不是很丰富:(

【讨论】:

  • 在将字典中的自定义 Swift 对象返回到回调块时,我遇到了这个问题。我想知道我应该如何知道这些字典中的值必须符合NSCoding
  • @Rivera NSCoding 协议允许将对象转换为NSData 对象,因此您可以执行诸如将其存储在 NSUserDefaults 中等操作。我实际上不知道您在做什么需要这个.我只能这么说。
  • 我正在使用 WatchKit。原因是作为参数传递的字典必须与属性列表兼容。它没有记录,但显示在控制台日志中。
  • 而且你必须将 NSObject 作为继承子句中的第一个。
猜你喜欢
  • 2021-07-06
  • 2017-05-22
  • 1970-01-01
  • 2023-01-25
  • 1970-01-01
  • 2011-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多