- initWithCoder:当-decodeObjectOfClass:forKey:返回nil

时间:2015-07-03 16:46:46

标签: objective-c encode

我想知道在编码时给定属性为NSSecureCoding时如何使用nil。请看以下示例:

- (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的习惯,因为它似乎是正确的模式。但是,在这种情况下,如果编码时_buffernil,那么在解码时如何判断分配失败?

2 个答案:

答案 0 :(得分:2)

我不确定你在这里试图处理的模式,但直接在编码器上使用setValue:我怀疑是奇怪的。我只使用过encode<SomeThing>: forKey:使用的if(_buffer == nil){ [aCoder encodeBool: true forKey: @"wasBufferNull"]; } 语法。从我所看到的,然后尝试解码相同的密钥将导致输出错误。

但是你要说你要区分一个实际为null的结果解码和一个你选择返回空值的失败状态?我仍然不确定你为什么这样处理它,但区别的唯一方法是选择一个不同的值来存储,如“缓冲区有一个零值”,然后在解码时检查该字符串,或存储一个你要检查的编码器的第二个关键:

xhtml

答案 1 :(得分:0)

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

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

例如:

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