我想知道在编码时给定属性为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
,那么在解码时如何判断分配失败?
答案 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"];
}