【发布时间】:2016-10-06 22:32:20
【问题描述】:
从 NSKeyedArchiver 获取崩溃
2016-10-06 17:06:06.713 MessagesExtension[24473:2175316] *** NSForwarding:
warning: object 0x61800009d740 of class '' does not implement
methodSignatureForSelector: -- trouble ahead
Unrecognized selector -[MessagesExtension.Model replacementObjectForKeyedArchiver:]
我创建了一个名为 Coding 的协议,其全部目的是简化 NSCoding 和 NSKeyedArchiver,而不需要使用 Objective-C 的片段.
protocol Coding {
static var directory: FileManager.SearchPathDirectory { get }
static var domainMask: FileManager.SearchPathDomainMask { get }
func encode() -> [String: AnyObject]
init()
init?(dict: [String: AnyObject]?)
}
extension Coding {
static var directory: FileManager.SearchPathDirectory {
return .documentDirectory
}
static var domainMask: FileManager.SearchPathDomainMask {
return .userDomainMask
}
static var directoryURL: String? {
return NSSearchPathForDirectoriesInDomains(Self.directory, Self.domainMask, true).last?.appending("/")
}
func save(to path: String) -> Bool {
guard let url = Self.directoryURL else { return false }
return NSKeyedArchiver.archiveRootObject(self.encode() as NSDictionary, toFile: url + path)
}
static func create(from path: String) -> Self {
guard let url = Self.directoryURL,
let dict = NSKeyedUnarchiver.unarchiveObject(withFile: url + path) as? [String: AnyObject] else { return self.init() }
return self.init(dict: dict) ?? self.init()
}
}
这个协议和扩展是为了简化 NSCoding 并允许在 Struts 上使用该协议。然而,我在尝试保存对象时遇到了上述崩溃。
更具体地说,我在
的返回线上遇到了崩溃func save(to path: String) -> Bool {
guard let url = Self.directoryURL else { return false }
return NSKeyedArchiver.archiveRootObject(self.encode() as NSDictionary, toFile: url + path)
}
我感觉它与 NSDictionary 有关,但我不确定如何继续。
有什么建议吗?
【问题讨论】:
-
您可以尝试让您的班级实现developer.apple.com/reference/objectivec/nsobject 中“归档”下的所有功能,但实际上,
NSCoding与NSObject紧密耦合 -
为什么 NSObject 不好?
-
目标是允许对结构进行归档。如果您必须使用 NSObject,这是不可能的。
-
这并不是真正使用NSCoding,只是获取NSKeyedArchiver的原理
标签: ios objective-c swift nscoding