首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >- initWithCoder:-decodeObjectOfClass:forKey:返回零

- initWithCoder:-decodeObjectOfClass:forKey:返回零
EN

Stack Overflow用户
提问于 2015-07-03 16:46:46
回答 2查看 620关注 0票数 1

当给定的属性编码时是nil时,我想知道如何使用nil。以下列例子为例:

代码语言:javascript
复制
- (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,那么如何从解码时的分配失败来判断这一点呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-03 17:45:35

我不确定您在这里试图处理的模式,但是直接在我怀疑的编码器上使用setValue:是很奇怪的。我只使用过并看到过使用过的encode<SomeThing>: forKey:语法。据我所见,试图解码同样的密钥会导致错误的输出。

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

代码语言:javascript
复制
if(_buffer == nil){
  [aCoder encodeBool: true forKey: @"wasBufferNull"];
}
票数 2
EN

Stack Overflow用户

发布于 2020-04-28 06:20:55

你问这个问题已经有一段时间了。但是如果其他人还想找到一个解决方案,…

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

例如:

代码语言:javascript
复制
- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:_buffer ?: [NSMutableData data] forKey:@"buffer"];
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31211288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档