我想知道当给定属性在编码时为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
,因为这似乎是正确的模式。但是,在这种情况下,如果编码时_buffer
为nil
,如何从解码时的分配失败中得知呢?
我不确定您要在此处处理的模式,但是我怀疑直接在编码器上使用setValue:
很奇怪。我只曾经使用过encode<SomeThing>: forKey:
语法。从我的角度来看,然后尝试对同一密钥进行解码将导致输出错误。
但是您是想区分实际为空的结果解码和选择返回空值的失败状态?我仍然不确定为什么要这样处理,但是唯一的区分方法是选择一个不同的值来存储,例如“缓冲区具有nil值”,然后在解码时检查该字符串,或者存储一个您要检查的编码器上的第二个键:
if(_buffer == nil){
[aCoder encodeBool: true forKey: @"wasBufferNull"];
}
距您提出这个问题已有一段时间了。但是如果其他人仍然有兴趣寻找解决方案...
对于NSData
/ NSMutableData
,关于如何区分nil
返回的decodeObjectOfClass:forKey:
是否是isKindOfClass:
检查失败的结果,而在nil
期间实际上是否是encodeWithCoder:
的一种想法,如果在编码过程中确实为[NSData data]
,则可以对nil
进行编码。
例如:
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:_buffer ?: [NSMutableData data] forKey:@"buffer"];
}