当给定的属性编码时是nil时,我想知道如何使用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,那么如何从解码时的分配失败来判断这一点呢?
发布于 2015-07-03 17:45:35
我不确定您在这里试图处理的模式,但是直接在我怀疑的编码器上使用setValue:是很奇怪的。我只使用过并看到过使用过的encode<SomeThing>: forKey:语法。据我所见,试图解码同样的密钥会导致错误的输出。
但是,您是说要区分结果解码实际上是空的,还是选择返回空值的失败状态?我仍然不知道您为什么要这样处理它,但是唯一的区分方法是选择一个不同的值来存储,比如“缓冲区有一个零值”,然后在解码时检查该字符串,或者在您要检查的编码器上存储第二个键:
if(_buffer == nil){
[aCoder encodeBool: true forKey: @"wasBufferNull"];
}发布于 2020-04-28 06:20:55
你问这个问题已经有一段时间了。但是如果其他人还想找到一个解决方案,…
对于NSData / NSMutableData来说,关于如何区分decodeObjectOfClass:forKey:返回的nil是否是isKindOfClass:检查失败的结果,以及在encodeWithCoder:期间是否实际上是nil的想法,可以是在编码过程中对[NSData data]进行编码,如果它确实是nil的话。
例如:
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:_buffer ?: [NSMutableData data] forKey:@"buffer"];
}https://stackoverflow.com/questions/31211288
复制相似问题