美文网首页iOS学习iOS Swift && Objective-CiOS Developer
NSKeyedArchiver 归档反归档Model 遵循Cop

NSKeyedArchiver 归档反归档Model 遵循Cop

作者: 李栖桐 | 来源:发表于2017-06-12 10:59 被阅读48次

想要将User直接一个Model保存在NSUserDefault

保存如下

            User *user = [User new];
            NSDictionary *userDic = resultDic[@"user"];
            [user setValuesForKeysWithDictionary: userDic];
            [SaveObject saveModel:user WithKey:@"user"];
            

SaveObject.h

/**
 *  保存对象
 */
+ (void)saveModel:(id)model WithKey:(NSString *)key;

/**
 *  获取对象
 */
+ (id)getModelWithKey:(NSString *)key;

SaveObject.m

// 保存对象
+ (void)saveModel:(id)model WithKey:(NSString *)key{
    NSMutableData *data = [NSMutableData data];
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    [archiver encodeObject:model forKey:key];
    [archiver finishEncoding];
    [[NSUserDefaults standardUserDefaults] setObject:data forKey:key];
}

// 获取对象
+ (id)getModelWithKey:(NSString *)key{
    NSData *deData = [[NSUserDefaults standardUserDefaults] objectForKey:key];
    NSKeyedUnarchiver *uKey = [[NSKeyedUnarchiver alloc] initForReadingWithData:deData];
    id model = [uKey decodeObjectForKey:key];
    return model;
}

但是这个时候会在这里出现这样的错误。


崩溃点 错误信息

划重点:归档自定义的对象 遵守NSCoding协议

添加 NSObject -> Category 命名:NSObject+FollowCoding

NSObject+FollowCoding.h 中 遵循 <NSCoding>

@interface NSObject (FollowCoding)<NSCoding>

NSObject+FollowCoding.m

- (void)encodeWithCoder:(NSCoder *)aCoder{
    unsigned int propertyCount = 0;
    objc_property_t *propertys = class_copyPropertyList([self class], &propertyCount);
    for (int i = 0; i < propertyCount; i++) {
        objc_property_t property = propertys[i];
        const char * key = property_getName(property);
        id value = [self valueForKey:[NSString stringWithUTF8String:key]];
        NSString *attr = [NSString stringWithUTF8String:property_getAttributes(property)];
        if ([attr componentsSeparatedByString:@","].count == 3) {
            [aCoder encodeInteger:[value integerValue] forKey:[NSString stringWithUTF8String:key]];
        } else{
            [aCoder encodeObject:value forKey:[NSString stringWithUTF8String:key]];
        }
    }
    free(propertys);
}

#pragma clang diagnostic ignored "-Wobjc-designated-initializers"
- (instancetype)initWithCoder:(NSCoder *)aDecoder{
    unsigned int propertyCount = 0;
    objc_property_t *propertys = class_copyPropertyList([self class], &propertyCount);
    for (int i = 0; i < propertyCount; i++) {
        objc_property_t property = propertys[i];
        const char * key = property_getName(property);
        NSString *attr = [NSString stringWithUTF8String:property_getAttributes(property)];
        if ([attr componentsSeparatedByString:@","].count == 3) {
            [self setValue:@([aDecoder decodeIntegerForKey:[NSString stringWithUTF8String:key]]) forKey:[NSString stringWithUTF8String:key]];
        } else{
            [self setValue:[aDecoder decodeObjectForKey:[NSString stringWithUTF8String:key]] forKey:[NSString stringWithUTF8String:key]];
        }
    }
    free(propertys);
    return self;
}


相关文章

  • NSKeyedArchiver 归档反归档Model 遵循Cop

    想要将User直接一个Model保存在NSUserDefault 保存如下 SaveObject.h SaveOb...

  • NSKeyedArchiver归档反归档

    数据持久化分析 在我们开发一个app时,一个重要的问题就是数据持久化问题,如何保存用户的设置信息,如何保存上次关闭...

  • 归档和反归档

    归档和反归档 归档和反归档 都遵循 NSCoding协议 .h中 学要实现归档和反归档的属性 .m中 是实现归档...

  • iOS 数据存储的常用方式

    XML属性列表(plist)归档 Preference(偏好设置) NSKeyedArchiver 归档 (NSC...

  • 数据存储的常用方式

    XML属性列表(plist)归档 Preference(偏好设置) NSKeyedArchiver归档(NSCod...

  • NSKeyedArchiver归档

    简介 归档在iOS中是另一种形式的序列化,只要遵循了NSCoding协议的对象都可以通过它实现序列化。由于决大多数...

  • NSKeyedArchiver(归档)

    .h中遵守协议并设置属性 .m中

  • NSKeyedArchiver归档

    简介 归档在iOS中是另一种形式的序列化,只要遵循了NSCoding协议的对象都可以通过它实现序列化。由于决大多数...

  • NSKeyedArchiver归档

    NSKeyedArchiver、NSKeyedUnarchiver ,主要用在ios数据存储上,数据从内存存储到闪...

  • iOS 归档NSKeyedArchiver

    一、归档NSKeyedArchiver和解归档NSKeyedUnarchiver 1.首先确定存储路径。 NSHo...

网友评论

    本文标题:NSKeyedArchiver 归档反归档Model 遵循Cop

    本文链接:https://www.haomeiwen.com/subject/tgzkqxtx.html