【问题标题】:NSCoder not working with NSArrayNSCoder 不能与 NSArray 一起使用
【发布时间】:2014-09-21 18:15:13
【问题描述】:

我正在尝试为我创建的具有自定义对象子数组的自定义对象实现 NSCoder 方法 encodeWithCoder 和 initWithCoder。两个自定义对象都使用上述方法,但在顶级对象被解码后,数组的值始终为 nil。

这两个对象都实现了以下方法,字典和数组,或者从我拥有的用于获取字段名称并将对象转换为字典的库中流行的方法。我检查了在数组上调用了 encodeObject ,此时数组不是零。我同样检查了解码方法在另一边收到 nil ..

我不知道哪里出错了?我是否正确假设只要子数组对象实现协议我就应该这样做吗?

- (void)encodeWithCoder:(NSCoder *)aCoder{
    NSDictionary* dictionary = [jrModelBinder unBind:self];
    for(NSString* field in dictionary)
    {
        id val = [self valueForKey:field];
        [aCoder encodeObject:val forKey:field];
    }
}

-(id)initWithCoder:(NSCoder *)aDecoder{
    if(self = [super init]){
        NSArray* fields = [jrModelBinder propertyNames:self];
        for(NSString* field in fields)
        {
            id val = [aDecoder decodeObjectForKey:field];
            [self setValue:val  forKey:field];
        }
    }
    return self;
}

【问题讨论】:

  • 别忘了在initWithCoder中致电[super initWithCoder:]
  • NSObject 没有实现 initWithCoder?
  • 您的问题中没有指定
  • 请用decodeWithCoder: 的实现来更新您的问题。
  • 我没有实现decodeWithCoder,好像不是NSCoder协议的一部分?

标签: objective-c nscoding nscoder


【解决方案1】:

我之前误解了你的问题:

NSKeyedArchiver/Unarchiver 应该可以毫无问题地对 NSArrays 和 NSDictionaries 进行编码和解码。

但我认为,由于您的数组本身包含自定义对象,它实现了以下 2 个功能:

- (id)initWithCoder:(NSCoder *)aDecoder
- (void)encodeWithCoder:(NSCoder *)enCoder

尝试使用下面的数组

NSData * encodedData = [NSKeyedArchiver archivedDataWithRootObject:someArray];

同样使用 NSKeyedUnarchiver 来解码。

【讨论】:

  • 您可能需要将数据保存在 File 或 NSDefault 中。
猜你喜欢
  • 2011-01-14
  • 2012-11-02
  • 1970-01-01
  • 2017-02-08
  • 2017-01-09
  • 2017-04-14
  • 2016-09-16
  • 2016-04-19
  • 1970-01-01
相关资源
最近更新 更多