實現(xiàn)NSCoding的自動歸檔和自動解檔

原理

通過以下方法獲取類的所有屬性,然后進行保存和讀取的操作

func class_copyIvarList(_ cls: AnyClass?, _ outCount: UnsafeMutablePointer<UInt32>?) -> UnsafeMutablePointer<Ivar>?

代碼實現(xiàn)

代碼為CSDN博主「番薯大佬」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議
原文鏈接:https://blog.csdn.net/potato512/article/details/80947946
.h

@interface Person : NSObject

@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSNumber *age;
@property (nonatomic, strong) NSString *address;
@property (nonatomic, strong) NSString *company;
@property (nonatomic, strong) NSString *job;

@end

.m

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

@implementation Person

- (id)initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super init])
    {
        unsigned int outCount;
        Ivar *ivars = class_copyIvarList([self class], &outCount);
        for (int i = 0; i < outCount; i ++)
        {
            Ivar ivar = ivars[i];
            NSString *key = [NSString stringWithUTF8String:ivar_getName(ivar)];
            [self setValue:[aDecoder decodeObjectForKey:key] forKey:key];
        }
    }
    return self;
}

- (void)encodeWithCoder:(NSCoder *)aCoder
{
    unsigned int outCount;
    Ivar *ivars = class_copyIvarList([self class], &outCount);
    for (int i = 0; i < outCount; i ++)
    {
        Ivar ivar = ivars[i];
        NSString *key = [NSString stringWithUTF8String:ivar_getName(ivar)];
        [aCoder encodeObject:[self valueForKey:key] forKey:key];
    }
}

@end


// 自動歸檔/解檔
NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:@"PersonInfo"];
if (data) {
        // 解檔使用
        Person *person = [NSKeyedUnarchiver unarchiveObjectWithData:data];
        NSLog(@"name: %@", person.name);
} else {
        Person *person = [Person new];
        person.name = @"devZhang";
        person.age = @(35);
        person.company = @"ShengXue";
        person.job = @"iOSDev";
        person.address = @"龍崗坂田國際中心";
        // 歸檔存儲
        data = [NSKeyedArchiver archivedDataWithRootObject:person];
        [[NSUserDefaults standardUserDefaults] setObject:data forKey:@"PersonInfo"];
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容