切换语言为:繁体
iOS 解档报错:“value for key 'NS.objects' was of unexpected class”

iOS 解档报错:“value for key 'NS.objects' was of unexpected class”

  • 爱糖宝
  • 2024-10-26
  • 2047
  • 0
  • 0

最近碰上iOS解档的时候报错了,错误是value for key 'NS.objects' was of unexpected class解决方案

iOS 11之前直接使用如下方法就可以进行归档,而且还可以直接取出转成自己需要的model,可是iOS 11不能这样弄了

NSArray * < testModel *> testArr = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];

iOS 11 之后官方文档又给出了几个新方法,当然我这里就用了一个所以这里就拿下边的方法做说明。

iOS 解档报错:“value for key 'NS.objects' was of unexpected class”

使用方法

  • JCTestModel,JCTestModel.h如下所示

需要注意一定要遵守NSSecureCoding协议

@interface JCTestModel : NSObject<NSSecureCoding>

@property (nonatomic, copy) NSString *late;

@property (nonatomic, copy) NSString *rore;

@property (nonatomic, copy) NSString *ation;

@property (nonatomic, copy) NSString *mode;

- (instancetype)initWithLate:(NSString *)late

                        rore:(NSString *)rore

                       ation:(NSString *)ation

                        mode:(NSString *)mode;

@end

  • JCTestModel.m如下所示

需要注意supportsSecureCoding这个方法一定要设置为 YES

#import "JCTestModel.h"
@implementation JCTestModel

- (instancetype)initWithLate:(NSString *)late
                        rore:(NSString *)rore
                       ation:(NSString *)ation
                        mode:(NSString *)mode{
    self = [super init];
    if (self) {
        _late = late;
        _rore = rore;
        _mode = mode;
        _ation = ation;
    }
    return self;
}


- (void)encodeWithCoder:(NSCoder *)aCoder {
    [aCoder encodeObject:self.late forKey:@"late"];
    [aCoder encodeObject:self.rore forKey:@"rore"];
    [aCoder encodeObject:self.mode forKey:@"mode"];
    [aCoder encodeObject:self.ation forKey:@"ation"];
}


- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    self = [super init];
    if (self) {
        _late = [aDecoder decodeObjectForKey:@"late"];
        _rore = [aDecoder decodeObjectForKey:@"rore"];
        _mode = [aDecoder decodeObjectForKey:@"mode"];
        _ation = [aDecoder decodeObjectForKey:@"ation"];
    }
    return self;
}

+ (BOOL)supportsSecureCoding{
    return YES;
}
@end

注意事项

  • 1.保存数据的时候需要注意下边方法中的requiringSecureCoding一定要设置成YES否则劳动半天不起作用
- (void)saveData:(NSMutableArray<JCTestModel *> *)data {
    NSString *filePath = @"这里写你自己本地缓存的地址";
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:data requiringSecureCoding:YES error:nil];
    [data writeToFile:filePath atomically:YES];
}

  • 2.读取数据的时候也需要注意一定要把你用到的数据类型都传进NSSet中。不然xcode也会报错的。
NSSet *allSet = [NSSet setWithObjects:
                                 [NSArray class],
                                 [JCTestModel class],
                                 [NSString class],
                                 nil];
NSArray *unarchivedObjects = [NSKeyedUnarchiver unarchivedObjectOfClasses:allSet fromData:data error:&error];

0条评论

您的电子邮件等信息不会被公开,以下所有项均必填

OK! You can skip this field.