假设我从NSKeyedArchiver
创建了一个文件,该文件被第三方修改/替换。所以当我尝试取消归档文件时。它应该无法初始化对象。
但是initWithCoder()不是一个可用的初始化器。所以当数据无效时我不能返回nil。但与此同时。取消归档对象时,NSKeyedUnarchiver
可以返回nil值。所以我真的很混淆如何在initWithCoder()中返回一个nil对象。
感谢。
答案 0 :(得分:1)
您可以从nil
awakeAfterUsingCoder(_:)
来自the document:
您必须从
initWithCoder:
返回自己。如果您有需要在解码后替换其他对象的高级需求,则可以在awakeAfterUsingCoder:
中执行此操作。
class Foo: NSObject, NSCoding {
override init() {}
required init(coder aDecoder: NSCoder) {
}
func encodeWithCoder(aCoder: NSCoder) {
}
override func awakeAfterUsingCoder(aCoder: NSCoder) -> AnyObject? {
return nil
}
}
let data = NSKeyedArchiver.archivedDataWithRootObject(Foo())
let obj: AnyObject? = NSKeyedUnarchiver.unarchiveObjectWithData(data) // -> nil
答案 1 :(得分:1)
我认为这可能在Swift 2.0中有所改变。查看API,init可以为空:
@protocol NSCoding
- (void)encodeWithCoder:(NSCoder *)aCoder;
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder; // NS_DESIGNATED_INITIALIZER
@end
Xcode版本7.0 beta 6(7A192o)