• iOS学习 --- iOS12对象序列化(NSKeyedArchiver/NSKeyedUnarchiver)


    NSKeyedArchiver 归档

    所谓的归档,就是将数据写到一个文件里面去。一般我们的应用的变量常量之类的数据都是在内存里面的,只要APP关闭,这些数据都会丢失。但是把数据存储到文件里面去,就能将数据保存到本地磁盘里面(目前iOS基本就是在沙盒里面操作了),不管是APP关闭还是重启设备,下次启动APP的时候都能够读出来。

    NSKeyedUnarchiver解档

    • 所谓解档(别人也叫反归档),就是将数据从文件里面读取出来。在程序里面使用。

    iOS12之前

    归档

    + (NSData *)archivedDataWithRootObject:(id)rootObject API_DEPRECATED("Use +archivedDataWithRootObject:requiringSecureCoding:error: instead", macosx(10.2,10.14), ios(2.0,12.0), watchos(2.0,5.0), tvos(9.0,12.0));
    1. NSMutableArray *array = [NSMutableArray array];
    2. for (ServiceModel *model in self.selectedArray) {
    3. NSData *data = [NSKeyedArchiver archivedDataWithRootObject:model];
    4. [array addObject:data];
    5. }
    6. [kUserDefaults setObject:array forKey:keySelectedArray];
    7. [kUserDefaults synchronize];

    解档

    + (nullable id)unarchiveObjectWithData:(NSData *)data API_DEPRECATED("Use +unarchivedObjectOfClass:fromData:error: instead", macosx(10.2,10.14), ios(2.0,12.0), watchos(2.0,5.0), tvos(9.0,12.0));
    1. NSMutableArray *localArray = [NSMutableArray array];
    2. //获取array
    3. NSArray *array = [[NSUserDefaults standardUserDefaults] objectForKey:keySelectedArray];
    4. for (NSData *data in array) {
    5. //解码
    6. ServiceModel*model = [NSKeyedUnarchiver unarchiveObjectWithData:data];
    7. [localArray addObject:model];
    8. }

    iOS12之后

    归档

    + (nullable NSData *)archivedDataWithRootObject:(id)object requiringSecureCoding:(BOOL)requiresSecureCoding error:(NSError **)error API_AVAILABLE(macos(10.13), ios(11.0), watchos(4.0), tvos(11.0));
    1. NSMutableArray *array = [NSMutableArray array];
    2. for (TCMeServiceModel *model in selectedArray) {
    3. NSData *data = [NSKeyedArchiver archivedDataWithRootObject:model requiringSecureCoding:YES error:nil];
    4. [array addObject:data];
    5. }
    6. [kUserDefaults setObject:array forKey:keySelectedArray];
    7. [kUserDefaults synchronize];

    解档

    + (nullable id)unarchivedObjectOfClasses:(NSSet *)classes fromData:(NSData *)data error:(NSError **)error API_AVAILABLE(macos(10.13), ios(11.0), watchos(4.0), tvos(11.0));
    1. NSMutableArray *localArray = [NSMutableArray array];
    2. //获取array
    3. NSArray *array = [[NSUserDefaults standardUserDefaults] objectForKey:keySelectedArray];
    4. for (NSData *data in array) {
    5. //解码
    6. NSSet *classSet = [NSSet setWithObjects:[ServiceModel class],[NSString class], nil];
    7. ServiceModel*model = [NSKeyedUnarchiver unarchivedObjectOfClasses:classSet fromData:data error:nil];
    8. if (model) {
    9. [localArray addObject:model];
    10. }
    11. }

    model

    1. #import
    2. NS_ASSUME_NONNULL_BEGIN
    3. @interface ServiceModel : NSObject<NSSecureCoding>//NSCopying,NSSecureCoding
    4. /** image */
    5. @property (nonatomic, copy) NSString *image;
    6. /** title */
    7. @property (nonatomic, copy) NSString *title;
    8. /** vc */
    9. @property (nonatomic, copy) NSString *vc;
    10. -(instancetype)initWithDict:(NSDictionary *)dict;
    11. +(instancetype)resultListWithDict:(NSDictionary *)dict;
    12. @end
    13. NS_ASSUME_NONNULL_END
    1. #import "ServiceModel.h"
    2. @implementation ServiceModel
    3. -(instancetype)initWithDict:(NSDictionary *)dict{
    4. self = [super init];
    5. if (self) {
    6. [self setValuesForKeysWithDictionary:dict];
    7. }
    8. return self;
    9. }
    10. +(instancetype)resultListWithDict:(NSDictionary *)dict{
    11. return [[self alloc]initWithDict:dict];
    12. }
    13. + (BOOL)supportsSecureCoding {
    14. return YES;
    15. }
    16. //归档
    17. - (void)encodeWithCoder:(nonnull NSCoder *)aCoder {
    18. [aCoder encodeObject:_image forKey:@"image"];
    19. [aCoder encodeObject:_title forKey:@"title"];
    20. [aCoder encodeObject:_vc forKey:@"vc"];
    21. }
    22. //解档
    23. - (nullable instancetype)initWithCoder:(nonnull NSCoder *)aDecoder {
    24. self = [super init];
    25. if (self) {
    26. _image = [aDecoder decodeObjectForKey:@"image"];
    27. _title = [aDecoder decodeObjectForKey:@"title"];
    28. _vc = [aDecoder decodeObjectForKey:@"vc"];
    29. }
    30. return self;
    31. }
    32. @end

    归档存储的是数组,数组中嵌套的是model对象:

    另:归档存储的是数组嵌套模型的时候:

    ①、model对象中要遵循NSSecureCoding协议;

    ②、model对象.m类中,要实现+ (BOOL)supportsSecureCoding方法,并返回真。

    相关文章

    iOS - iOS 12 之后的归档(NSKeyedArchiver)、解档(NSKeyedUnarchiver)用法

    ​​​​​​​ iOS 12对象序列化(NSKeyedArchiver)

    iOS应用存储数据的常用的方式之plist和归档​​​​​​​

  • 相关阅读:
    SwiftUI之iOS16中的三种SF字体的样式和使用
    阿里云EasyExcel读写excel表数据
    《程序员面试金典(第6版)》面试题 02.05. 链表求和(构建一个新链表)
    Spring 面试题
    zookeeper的ZAB协议的原理以及底层源码实现超级详解
    Simulink 自动代码生成电机控制:非线性磁链观测器
    链接装载与库:第十一章——运行库
    【算法100天 | 20】有环/无环链表的相交问题(Java实现)
    一文讲清楚 JVM Safe Point
    DMSA(Distributed multi-scenario analysis)
  • 原文地址:https://blog.csdn.net/jiaxin_1105/article/details/125601997