IOS 利用運行時機制來進行歸檔解檔

前言:我們需要對一個類的屬性進行歸檔解檔的時候屬性特別的多,這時候,我們就會寫很多對應的代碼,但是如果使用了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






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章