IOSRunTime_OC의 서열화

3469 단어

런타임을 사용하여 런타임을 실행할 때 클래스의 모든 속성과 방법을 반복합니다.


시리얼화 ------- 아카이빙


반서열화--해제


iOS에서 사용자 정의 대상은 파일에 직접 저장할 수 없으며, 반드시 이진 흐름으로 전환해야 한다.대상에서 바이너리 데이터로의 과정을 우리는 일반적으로 대상의 서열화(Serialization)라고도 부르고 압축파일(Archive)이라고도 부른다.같은 이치로 2진 데이터에서 대상까지의 과정을 일반적으로 반서열화 또는 반압축 파일이라고 부른다Person.h
#import 

@interface Person : NSObject
/**
  
 */
@property (nonatomic, assign) int age;
/**
  
 */
@property (nonatomic, copy) NSString *name;
@end
Person.m
- (void)encodeWithCoder:(NSCoder *)aCoder {
    [aCoder encodeObject:_name forKey:@"name"];
    [aCoder encodeInt:_age forKey:@"age"];
    
    // ( )
//    for (int i = 0; i <  ; i ++) {
//        // 
//        value
//        key
//        [aCoder encodeObject:value forKey:key];
//    }
}
- (instancetype)initWithCoder:(NSCoder *)coder
{
    self = [super init];
    if (self) {
        // 
        _name = [coder decodeObjectForKey:@"name"];
        _age  = [coder decodeIntForKey:@"age"];
    }
    return self;
}
@end
ViewController.m
#import "ViewController.h"
#import "Person.h"
@interface ViewController ()

@end
@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"%@",NSTemporaryDirectory());
}
- (IBAction)save:(UIButton *)sender {
    Person *p = [Person new];
    p.name = @"LL";
    p.age = 18;
    
    // 
    NSString *temp = NSTemporaryDirectory();
    NSString *filePath = [temp stringByAppendingPathComponent:@"LL.LOVE"];
    
    // 
    [NSKeyedArchiver archiveRootObject:p toFile:filePath];
}

- (IBAction)read:(UIButton *)sender {
    
    // 
    NSString *temp = NSTemporaryDirectory();
    NSString *filePath = [temp stringByAppendingPathComponent:@"LL.LOVE"];

    // 
    Person *p = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
    NSLog(@"%@--%d",p.name,p.age);
}
@end

다음 부분은 RunTime을 이용하여 실행할 때 한 종류의 모든 속성과 방법을 두루 훑어보고 여러 가지 속성을 서열화, 반서열화하는 문제를 최적화시켰다

Person.m
#import "Person.h"
#import 

@interface Person ()
@property (nonatomic,copy) NSString *name_X;//runtime   
@end

- (void)encodeWithCoder:(NSCoder *)aCoder {
    unsigned int count = 0;
    Ivar *ivars = class_copyIvarList([Person class], &count);
    for (int i = 0; i < count; i ++) {
        // 
        Ivar ivar = ivars[i];
        const char * name = ivar_getName(ivar);
        NSString *key = [NSString stringWithUTF8String:name];
        // 
        id value = [self valueForKey:key];
        // 
        [aCoder encodeObject:value forKey:key];
    }
    //C 
    free(ivars);
}
- (instancetype)initWithCoder:(NSCoder *)coder
{
    self = [super init];
    if (self) {
        // 
        unsigned int count = 0;
        Ivar *ivars = class_copyIvarList([Person class], &count);
        for (int i = 0; i < count; i ++) {
            // 
            Ivar ivar = ivars[i];
            const char * name = ivar_getName(ivar);
            NSString *key = [NSString stringWithUTF8String:name];
            // 
            id value = [coder decodeObjectForKey:key];
            //  KVC
            [self setValue:value forKey:key];
        }
        //C 
        free(ivars);
    }
    return self;
}
@end

좋은 웹페이지 즐겨찾기