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

问题描述 投票:1回答:2

我想知道当给定属性在编码时为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,如何从解码时的分配失败中得知呢?

objective-c encode
2个回答
2
投票

我不确定您要在此处处理的模式,但是我怀疑直接在编码器上使用setValue:很奇怪。我只曾经使用过encode<SomeThing>: forKey:语法。从我的角度来看,然后尝试对同一密钥进行解码将导致输出错误。

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

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

0
投票

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

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

例如:

- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:_buffer ?: [NSMutableData data] forKey:@"buffer"];
}
© www.soinside.com 2019 - 2024. All rights reserved.