iOS中使用runtime進行數(shù)據模型類的序列化和反序列化

demo下載地址
在 iOS 中歸檔數(shù)據時,如果歸檔的是我們自定義的數(shù)據模型類,則需要我們手動進行序列化和反序列化才能進行歸檔.
在此,我們使用 runtime 進行序列化和反序列化,思路大致為:新建一個數(shù)據模型的基類,基類.h文件中不需要寫任何屬性, 然后在基類的.m文件中利用 runtime 進行序列化和反序列化,至此基類已經完成.此后如果我們工程中哪一個數(shù)據模型類需要進行歸檔存儲,就可以直接繼承前面的基類即可.也就是說繼承基類的其它數(shù)據模型類無需再進行序列化和反序列化就可以進行歸檔數(shù)據.
不多說,開始做,上代碼,以下是步驟:

1.新建數(shù)據模型基類WLNSObject

基類一定要遵守NSCoding協(xié)議.
.h文件如下:

#import <Foundation/Foundation.h>

@interface WLNSObject : NSObject<NSCoding>
@en

.m文件如下:

#import "WLNSObject.h"
#import <objc/runtime.h>

@implementation WLNSObject

//序列化
-(void)encodeWithCoder:(NSCoder *)aCoder{
    unsigned int ivarCount = 0;
    Ivar *ivars = class_copyIvarList([self class], &ivarCount);
    for (unsigned int i = 0; i < ivarCount; i++) {
        const char *ivar_name = ivar_getName(ivars[i]);
        NSString *key = [NSString stringWithCString:ivar_name encoding:NSUTF8StringEncoding];
        [aCoder encodeObject:[self valueForKey:key] forKey:key];
    }
}

//反序列化
- (instancetype)initWithCoder:(NSCoder *)coder
{
    self = [super init];
    if (self) {
        unsigned int ivarCount = 0;
        Ivar *ivars = class_copyIvarList([self class], &ivarCount);
        for (unsigned int i = 0; i < ivarCount; i++) {
            const char *ivar_name = ivar_getName(ivars[i]);
            NSString *key = [NSString stringWithCString:ivar_name encoding:NSUTF8StringEncoding];
            [self setValue:[coder decodeObjectForKey:key] forKey:key];
        }
    }
    return self;
}

@end

2.新建繼承基類WLNSObject的數(shù)據模型Man

Man的.h文件如下:

#import "WLNSObject.h"

@interface Man : WLNSObject
@property (nonatomic, strong) NSString *name;
@end

Man的.m文件中不需要任何操作,在這里就不列出了.

3.新建繼承基類WLNSObject的數(shù)據模型Person

Person的.h文件如下:

#import <Foundation/Foundation.h>
#import "WLNSObject.h"
#import "Man.h"

@interface Person : WLNSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger age;
@property (nonatomic, strong) Man *friend;
@end

Person的.m文件中不需要任何操作,在這里就不列出了.

4.進行歸檔測試

在main.m中進行測試, 如下:

#import "ViewController.h"
#import "Man.h"
#import "Person.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    Person *obj = [[Person alloc] init];
    obj.name = @"Jack";
    obj.age = 27;
    
    obj.friend = [[Man alloc] init];
    obj.friend.name = @"Tom";
    
    //歸檔
    [[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:obj] forKey:@"myObj"];
    [[NSUserDefaults standardUserDefaults] synchronize];
    //反歸檔
    Person *p = [NSKeyedUnarchiver unarchiveObjectWithData:[[NSUserDefaults standardUserDefaults] dataForKey:@"myObj"]];
    
    NSLog(@"p.name:%@, p.age:%lu, p.friend.name = %@", p.name, p.age, p.friend.name);

}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end

輸出結果如下:

2017-03-07 23:27:08.119 NSCodingDemo[14355:781208] p.name:Jack, p.age:27, p.friend.name = Tom

至此,我們所有繼承基類WLNSObject的數(shù)據模型無需再進行序列化和反序列化就可以進行歸檔數(shù)據了.

轉發(fā)自:http://www.itdecent.cn/p/b156040307c3

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容