如何在解压缩无效文件时使initWithCoder()变得可用?

时间:2015-02-21 03:36:58

标签: swift

假设我从NSKeyedArchiver创建了一个文件,该文件被第三方修改/替换。所以当我尝试取消归档文件时。它应该无法初始化对象。

但是initWithCoder()不是一个可用的初始化器。所以当数据无效时我不能返回nil。但与此同时。取消归档对象时,NSKeyedUnarchiver可以返回nil值。所以我真的很混淆如何在initWithCoder()中返回一个nil对象。

感谢。

2 个答案:

答案 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)