前言:我們需要對一個類的屬性進行歸檔解檔的時候屬性特別的多,這時候,我們就會寫很多對應的代碼,但是如果使用了runtime就可以動態設置,就會變的很輕鬆!
首先需要導入<objc/runtime.h>
其次歸檔解檔需要遵循NSCoding協議
核心代碼
- (void)encodeWithCoder:(NSCoder *)encoder
{
unsigned int count = 0;
//1.獲取該類所有的成員變量
Ivar *ivars = class_copyIvarList([IWMerchantBasicInfo class], &count);
for (int i = 0; i < count; i ++) {
Ivar ivar = ivars[i];
//2.查看成員變量
const char *name = ivar_getName(ivar);
//3.根據key獲取到對應的value
NSString *key = [NSString stringWithUTF8String:name];
id value = [self valueForKey:key];
//4.歸檔
[encoder encodeObject:value forKey:key];
}
//5.釋放
free(ivars);
}
- (instancetype)initWithCoder:(NSCoder *)decoder
{
if (self = [super init]) {
unsigned int count = 0;
//1.獲取該類所有的成員變量
Ivar *ivars = class_copyIvarList([IWMerchantBasicInfo class], &count);
for (int i = 0 ; i < count; i ++) {
Ivar ivar = ivars[i];
//2.查看成員變量
const char *name = ivar_getName(ivar);
//3.根據key獲取到對應的value
NSString *key = [NSString stringWithUTF8String:name];
id value = [self valueForKey:key];
[self setValue:value forKey:key];
}
//4.釋放
free(ivars);
}
return self;
}
示例代碼:
.h文件
#import <Foundation/Foundation.h>
@interface IWMerchantBasicInfo : NSObject<NSCoding>
//商鋪編碼
@property (copy,nonatomic) NSString *merchant_id;
//商鋪名稱
@property (copy,nonatomic) NSString *merchant_name;
//商鋪Logo
@property (copy,nonatomic) NSString *logo;
//商鋪描述
@property (copy,nonatomic) NSString *merchant_des;
//商鋪描述圖片
@property (copy,nonatomic) NSString *merchant_des_pic;
//商鋪描述圖片
@property (copy,nonatomic) NSArray *merchant_des_pics;
//聯繫人
@property (copy,nonatomic) NSString *contact;
//聯繫手機號碼
@property (copy,nonatomic) NSString *contact_phone;
//固定電話號碼
@property (copy,nonatomic) NSString *landline_phone;
//營業時間
@property (copy,nonatomic) NSString *business_times;
//廣告語
@property (copy,nonatomic) NSString *ad;
//商家分類
@property (copy,nonatomic) NSString *category_id;
//經度
@property (assign,nonatomic) float longitude;
//緯度
@property (assign,nonatomic) float latitude;
//店鋪地址
@property (copy,nonatomic) NSString *merchant_address;
//商家活動小圖標
@property (copy,nonatomic) NSString *bd_thumbnail;
//商家活動小圖標數組
@property (nonatomic,strong) NSArray *bdThumbnails;
//評分
@property (assign,nonatomic) float score;
//是否被收藏
@property (nonatomic,assign) BOOL collected;
@end
.m文件
#import "IWMerchantBasicInfo.h"
#import <objc/runtime.h>
@implementation IWMerchantBasicInfo
- (void)setBd_thumbnail:(NSString *)bd_thumbnail
{
_bd_thumbnail = bd_thumbnail;
if (_bd_thumbnail.length != 0) {
NSMutableArray *array = (NSMutableArray *)[_bd_thumbnail componentsSeparatedByString:@","];
for (NSString *arrayStr in array) {
if (arrayStr.length == 0 || [arrayStr isEqualToString:@""]) {
[array removeObject:arrayStr];
}
}
_bdThumbnails = array;
}
}
- (void)setMerchant_des_pic:(NSString *)merchant_des_pic
{
_merchant_des_pic = merchant_des_pic;
if (_merchant_des_pic.length != 0) {
NSMutableArray *array = (NSMutableArray *)[_merchant_des_pic componentsSeparatedByString:@","];
for (NSString *arrayStr in array) {
if (arrayStr.length == 0 || [arrayStr isEqualToString:@""]) {
[array removeObject:arrayStr];
}
}
_merchant_des_pics = array;
}
}
- (void)encodeWithCoder:(NSCoder *)encoder
{
unsigned int count = 0;
//1.獲取該類所有的成員變量
Ivar *ivars = class_copyIvarList([IWMerchantBasicInfo class], &count);
for (int i = 0; i < count; i ++) {
Ivar ivar = ivars[i];
//2.查看成員變量
const char *name = ivar_getName(ivar);
//3.根據key獲取到對應的value
NSString *key = [NSString stringWithUTF8String:name];
id value = [self valueForKey:key];
//4.歸檔
[encoder encodeObject:value forKey:key];
}
//5.釋放
free(ivars);
}
- (instancetype)initWithCoder:(NSCoder *)decoder
{
if (self = [super init]) {
unsigned int count = 0;
//1.獲取該類所有的成員變量
Ivar *ivars = class_copyIvarList([IWMerchantBasicInfo class], &count);
for (int i = 0 ; i < count; i ++) {
Ivar ivar = ivars[i];
//2.查看成員變量
const char *name = ivar_getName(ivar);
//3.根據key獲取到對應的value
NSString *key = [NSString stringWithUTF8String:name];
id value = [self valueForKey:key];
[self setValue:value forKey:key];
}
//4.釋放
free(ivars);
}
return self;
}
@end