runtime使用一:利用runtime实现归解档

使用runtime的好处:1.当成员属性很多很多的时候大大减少了代码,
2.当成员属性修改了不影响该类的归档接档
建立一个类person,使用runtime实现该类的归解档
person.h

@interface Person : NSObject <NSCoding,NSSecureCoding>

@property (nonatomic, strong) NSString *name;

@end

person.m

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

@interface Person ()
{
    int _age;
}

@end

@implementation Person

- (instancetype)init {
    
    self = [super init];
    if (self) {
        
        _age = 12;
    }
    return self;
}

// 解档使用
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    
    self = [super init];
    if (self) {
        
        unsigned int count = 0;
        Ivar *list = class_copyIvarList(self.class, &count);
        for (int i = 0; i < count; i++) {
            NSString *name = [NSString stringWithUTF8String:ivar_getName(list[i])];
            [self setValue:[aDecoder decodeObjectForKey:name] forKey:name];
        }
    }
    return self;
}

// 归档使用
- (void)encodeWithCoder:(NSCoder *)coder {
    
    unsigned int count = 0;
    Ivar *list = class_copyIvarList(self.class, &count);
    for (int i = 0; i < count; i++) {
        NSString *name = [NSString stringWithUTF8String:ivar_getName(list[i])];
        NSString *value = [self valueForKey:name];
        [coder encodeObject:value forKey:name];
    }
}

// NSSecureCoding协议需要实现的方法
+ (BOOL)supportsSecureCoding {
    
    return YES;
}

- (NSString *)description {
    
    return [NSString stringWithFormat:@"name=%@ age=%d",_name,_age];
}

@end

调用处如下
ViewController.m

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

@interface ViewController ()
{
    NSData *_data;
}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}
// 归档的button点击实现 xib
- (IBAction)save:(id)sender {
    
    Person *p = [[Person alloc] init];
    p.name = @"12";
   
    NSError *error;
    _data = [NSKeyedArchiver archivedDataWithRootObject:p requiringSecureCoding:NO error:&error];
    
    if (error) {
        
        NSLog(@"zhousuhua error=%@ data=%@",error,_data);
    } else {
        
        NSLog(@"zhousuhua success error=%@ data=%@",error,_data);
    }
}

// 接档button的点击事件,xib
- (IBAction)get:(id)sender {
    
    NSError *error;
    Person *p = [NSKeyedUnarchiver unarchivedObjectOfClass:[Person class] fromData:_data error:&error];
    if (error) {
        
        NSLog(@"zhousuhua error=%@ description=%@",error,p.description);
    } else {
        
        NSLog(@"zhousuhua success=%@ description=%@",error,p.description);
    }
}

@end
发布了40 篇原创文章 · 获赞 10 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/ai_pple/article/details/90024616