- initWithCoder: 当-decodeObjectOfClass:forKey: returns 无

- initWithCoder: when -decodeObjectOfClass:forKey: returns nil

我想知道当给定的 属性 编码时 nil 如何使用 NSSecureCoding。举个例子:

- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
    self = [super init];

    if (self) {

        _buffer = [aDecoder decodeObjectOfClass:[NSMutableData class] forKey:@"buffer"];

        if (_buffer == nil) {
            self = nil;
        }
    }

    return self;
}

- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder setValue:_buffer forKey:@"buffer"];
}

我养成了每当分配失败时将 self 设置为 nil 的习惯,因为这似乎是一个正确的模式。但是,在这种情况下,如果 _buffer 在编码时是 nil,我如何在解码时从分配失败中判断出来?

我不确定你在这里尝试处理的模式,但我怀疑直接在编码器上使用 setValue: 很奇怪。我只使用过,也只见过 encode<SomeThing>: forKey: 语法。从我所看到的情况来看,尝试解码同一个密钥将导致输出错误。

但是您是说您想要区分实际为空的结果解码和您选择 return 空值的失败状态?我仍然不确定你为什么要这样处理它,但唯一的区分方法是选择一个不同的值来存储,比如 "The Buffer has a nil value" 然后在解码时检查该字符串,或者将第二个键存储在您要检查的编码器:

if(_buffer == nil){
  [aCoder encodeBool: true forKey: @"wasBufferNull"];
}

你问这个问题已经有一段时间了。但如果其他人仍然有兴趣找到解决方案……

对于 NSData / NSMutableData,关于如何区分 decodeObjectOfClass:forKey: 返回的 nil 是否是 isKindOfClass: 检查失败的结果的一种想法,与在 encodeWithCoder: 期间是否实际上是 nil 相比,如果在编码期间确实是 nil,则可以编码 [NSData data]

例如:

- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:_buffer ?: [NSMutableData data] forKey:@"buffer"];
}