簡(jiǎn)單的創(chuàng)建一個(gè)Person對(duì)象,并聲明幾個(gè)屬性
@interface Person : NSObject<NSCoding> // 歸檔問題 必須遵守該協(xié)議
/** */
@property(copy,nonatomic)NSString * name;
/** */
@property(assign,nonatomic)int age;
@property(assign,nonatomic)int age1;
@end
歸檔
設(shè)置哪些屬性是需要?dú)w檔的
//告訴系統(tǒng),歸檔哪些屬性
- (void)encodeWithCoder:(NSCoder *)coder
{
//利用runtime 來歸檔!!
unsigned int count = 0;
// 拷貝一個(gè)類 的屬性列表
Ivar * ivars = class_copyIvarList([Person class], &count); // 在C語(yǔ)言中 但凡看到了一個(gè)傳遞了基本數(shù)據(jù)類型的指針 一般都是在函數(shù)中 改變外面參數(shù)的值 (這個(gè)ivars 可以形象的比喻為 數(shù)組 但是又區(qū)別于數(shù)組 如當(dāng)我們 做ivars[100] 有可能不會(huì)報(bào)我們常見的數(shù)組越界而返回一個(gè)null 所以你懂得)
for (int i = 0; i < count; i++) {
//拿出每一個(gè)Ivar
Ivar ivar = ivars[i];
const char * name = ivar_getName(ivar); // 將屬性轉(zhuǎn)行成字符串
NSString * KEY = [NSString stringWithUTF8String:name];
//歸檔
[coder encodeObject:[self valueForKey:KEY] forKey:KEY]; // 通過KVC 來拿到當(dāng)前類 的屬性
}
//C語(yǔ)言里面!! 一旦遇到了copy creat new 需要釋放 (否則 我們歸檔一次 內(nèi)存泄漏一次 導(dǎo)致內(nèi)存暴增)
free(ivars);
}
解檔
設(shè)置哪些屬性需要解檔
- (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 設(shè)置
[self setValue:value forKey:KEY]; // 通過KVC 將拿到的 值 設(shè)置給當(dāng)前類 的 屬性
}
free(ivars); // 釋放內(nèi)存
}
return self;
}
使用
- (IBAction)save:(id)sender {
//創(chuàng)建一個(gè)對(duì)象
Person * p = [[Person alloc]init];
p.name = @"hank";
p.age = 18;
p.age1 = 18;
NSString * tmpPath = NSTemporaryDirectory(); // 這里我們暫且放在 temp 路徑里
NSString * filePath = [tmpPath stringByAppendingPathComponent:@"hank.hank"];
//歸檔!!
[NSKeyedArchiver archiveRootObject:p toFile:filePath];
}
- (IBAction)read:(id)sender {
//路徑
NSString * tmpPath = NSTemporaryDirectory();
NSString * filePath = [tmpPath stringByAppendingPathComponent:@"hank.hank"];
//解檔
Person * p = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
NSLog(@"%@老師今年%d歲了!真實(shí)年齡是:%d",p.name,p.age,p.age1);
}