runtime序列化与反序列化

本文介绍了一种使用Runtime机制来简化NSCoding协议实现的方法。通过Runtime动态获取类的所有属性,并自动进行归档和解档,避免每次添加新属性时都需要修改NSCoding协议方法的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用简单的数据存储有时候需要用到 NSCoding协议 实现其 encodeWithCoder 与 initWithCoder 方法

一般实现的姿势是这样的:

1706dede69d49f7e1a8590006d7fef6c92a.jpg

a695f8535db9f98dba96addd02f14fc9b1d.jpg

 

但是这样会有一个缺陷, 如果我们想加一个属性, 就要再在NSCoding代理方法里加入属性的序列化和反序列化操作, 否则会很容易导致项目崩溃, 那么有没有一种方式实现NSCOding协议而又不用再修改呢, 这时就需要用到强大的runtime了:

b009b66b9848bc91060aae66c94f2706e83.jpg

这样写的好处是不管有多少属性, 这两个方法都能通过runtime获取所有属性存取解决, 以后再添加任何属性都不用担心NSCoding协议方法会有问题啦

// copy代码请下拉:

// 归档

- (void)encodeWithCoder:(NSCoder *)aCoder {

    unsigned int count = 0;

    //1.取出所有的属性

    objc_property_t *propertes = class_copyPropertyList([self class], &count);

    //2.遍历的属性

    for (int i=0; i<count; i++) {

        //获取当前遍历的属性的名称

        const char *propertyName = property_getName(propertes[i]);

        NSString *name = [NSString stringWithUTF8String:propertyName];

        //利用KVC取出对应属性的值

        id value = [self valueForKey:name];

        //归档到文件中

        [aCoder encodeObject:value forKey:name];

    }

}

// 解档

- (instancetype)initWithCoder:(NSCoder *)aDecoder {

    if (self = [super init]) {

        unsigned int count =0;

        //1.取出所有的属性

        objc_property_t *propertes = class_copyPropertyList([self class], &count);

        //2.遍历所有的属性

        for (int i = 0; i < count; i++) {

            //获取当前遍历到的属性名称

            const char *propertyName = property_getName(propertes[i]);

            NSString *name = [NSString stringWithUTF8String:propertyName];

            //解归档前遍历得到的属性的值

            id value = [aDecoder decodeObjectForKey:name];

            [self setValue:value forKey:name];

        }

    }

    return self;

}

 

转载于:https://my.oschina.net/u/3127531/blog/1830478

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值