【发布时间】:2019-05-20 06:19:15
【问题描述】:
在为自定义 NSView 子类实现init(coder:) 的过程中,我遇到了一些我仍然不完全理解的 NSKeyedArchiver 和 NSKeyedUnarchiver 的奇怪行为。考虑这个示例代码:
let label = NSTextField(labelWithString: "Test")
// Encode
let data = try NSKeyedArchiver.archivedData(withRootObject: label, requiringSecureCoding: false)
// Decode
try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) as? NSTextField
这似乎可以按预期对 NSTextField 进行编码和解码。但是,如果我尝试使用decodeTopLevelObject() 而不是unarchiveTopLevelObjectWithData(_:),结果是nil:
// Encode
let data = try NSKeyedArchiver.archivedData(withRootObject: label, requiringSecureCoding: false)
// Decode
let decoder = try NSKeyedUnarchiver(forReadingFrom: data)
decoder.decodeTopLevelObject() as? NSTextField // nil
同样,如果我尝试使用encodedData 而不是archivedData(withRootObject:requiringSecureCoding:),结果是nil:
// Encode
let coder = NSKeyedArchiver(requiringSecureCoding: false)
coder.encodeRootObject(label)
let data = coder.encodedData
// Decode
try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) as? NSTextField // nil
如果我使用encode(_:forKey:) 和decodeObject(forKey:),结果甚至是nil:
// Encode
let coder = NSKeyedArchiver(requiringSecureCoding: false)
coder.encode(label, forKey: "label")
let data = coder.encodedData
// Decode
let decoder = try NSKeyedUnarchiver(forReadingFrom: data)
decoder.decodeObject(forKey: "label") as? NSTextField // nil
我很惊讶上面的第一个示例似乎可以正常工作,但其他示例都没有(尤其是最后一个)。有人可以帮我理解这里发生了什么吗?
【问题讨论】:
标签: swift nskeyedarchiver nscoder nskeyedunarchiver