美文网首页iOS日常开发
iOS 利用宏一键实现归档代码

iOS 利用宏一键实现归档代码

作者: 风与鸾 | 来源:发表于2017-06-15 10:44 被阅读4次

实际开发中只需要在使用的类里面加上LPCodingPropertyImplementatio即可

// 一键实现property 属性归档 暂时不支持ivar

#ifndef LPCodingHeader_h
#define LPCodingHeader_h

#import <objc/runtime.h>
#import <UIKit/UIKit.h>

typedef void(^LPCodingHandler)(objc_property_t property, NSString * propertyName);

/// 遍历属性列表
#define LPCodingHandlerDef    \
    - (void)codingPropertiesWithHandler:(LPCodingHandler) codingHandler \
    { \
        unsigned int propertyCount; \
        objc_property_t *properties = class_copyPropertyList([self class], &propertyCount);\
        for (int i = 0; i<propertyCount; i++) { \
            \
            objc_property_t property = properties[i];\
            if (codingHandler) {\
                \
                codingHandler(property,[NSString stringWithUTF8String:property_getName(property)]);\
            }\
        }\
        \
        free(properties);\
    }

// 序列化
#define LPEncodeWithCoder \
- (void)encodeWithCoder:(NSCoder *)aCoder \
{ \
    [self codingPropertiesWithHandler:^(objc_property_t property, NSString *propertyName) { \
        [aCoder encodeObject:[self valueForKey:propertyName] forKey:propertyName]; \
    }]; \
}

// 反序列化
#define LPInitWithCoder \
    - (nullable instancetype)initWithCoder:(NSCoder *)aDecoder \
    { \
        self = [super init]; \
        if (self) { \
            [self codingPropertiesWithHandler:^(objc_property_t property, NSString *propertyName) { \
                [self setValue:[aDecoder decodeObjectForKey:propertyName] forKey:propertyName]; \
            }]; \
        } \
        return self; \
    } 

// 遵守NSCoding协议的model只要在.m中加入这句宏定义,即可实现序列化反序列化功能

#define LPCodingPropertyImplementation \
        LPCodingHandlerDef \
        LPEncodeWithCoder \
        LPInitWithCoder

#endif /* LPCodingHeader_h */

相关文章

网友评论

    本文标题:iOS 利用宏一键实现归档代码

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