IOSRunTime_OC의 서열화
런타임을 사용하여 런타임을 실행할 때 클래스의 모든 속성과 방법을 반복합니다.
시리얼화 ------- 아카이빙
반서열화--해제
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.