實際開發(fā)中只需要在使用的類里面加上LPCodingPropertyImplementatio
即可
// 一鍵實現(xiàn)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協(xié)議的model只要在.m中加入這句宏定義,即可實現(xiàn)序列化反序列化功能
#define LPCodingPropertyImplementation \
LPCodingHandlerDef \
LPEncodeWithCoder \
LPInitWithCoder
#endif /* LPCodingHeader_h */
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者