FJIdol.h
#import <Foundation/Foundation.h>工具
//遵照NSCoding協議:須要實現協議方法atom
@interface FJIdol : NSObject <NSCoding>spa
@property (nonatomic,copy) NSString *name;.net
@property (nonatomic,copy) NSString *sex;3d
//CGFloat OC中的浮點型code
//NSInteger 整型(32)/長整型(64)orm
//NSUInteger 無符號的整型/長整型對象
@property (nonatomic,assign) CGFloat score;ip
@property (nonatomic,assign) NSInteger face;get
- (instancetype) initWithName:(NSString *)name
sex:(NSString *)sex
score:(CGFloat) score
face:(NSInteger) face;
@end
FJIdol.m
#import "FJIdol.h"
@implementation FJIdol
//歸檔:將當前類中須要歸檔的屬性歸檔(就是將數據存儲到本地)
//aCoder歸檔對象(就是專門用來對屬性進行歸檔);
- (void)encodeWithCoder:(NSCoder *)aCoder{
//用來歸檔對象的方法
// - (void)encodeObject:(id)objv forKey:(NSString *)key;
//注意歸檔方法和須要歸檔的屬性的類型要匹配;
//歸檔姓名
[aCoder encodeObject:_name forKey:@"name"];
//歸檔性別
[aCoder encodeObject:_sex forKey:@"sex"];
//歸檔分數
[aCoder encodeFloat:_score forKey:@"score"];
//歸檔顏值
[aCoder encodeInteger:_face forKey:@"face"];
}
//解歸檔的協議方法;
//將類中的已經歸檔的屬性解歸檔出來;
- (id)initWithCoder:(NSCoder *)aDecoder{
if (self = [super init]) {
//注意:
//1.對於同一個屬性來講,使用什麼樣的方式將屬性歸檔,就須要使用相同的方式解歸檔
//2.歸檔和解歸檔的key值要一致
//3.賦值也必定要有!!
//解歸檔姓名
_name = [aDecoder decodeObjectForKey:@"name"];
//解歸檔性別
_sex = [aDecoder decodeObjectForKey:@"sex"];
//解歸檔分數
_score = [aDecoder decodeFloatForKey:@"score"];
//解歸檔顏值
_face = [aDecoder decodeIntegerForKey:@"face"];
}
return self;
}
- (instancetype)initWithName:(NSString *)name sex:(NSString *)sex score:(CGFloat)score face:(NSInteger)face{
if ( self = [super init]) {
_name = name;
_sex = sex;
_score =score;
_face = face;
}
return self;
}
- (NSString *)description{
return [NSString stringWithFormat:@"%@ %@ %f %lu",
_name,_sex,_score,_face];
}
@end
main.m
//歸檔的目的:將本身的類的對象存儲到本地
//歸檔的步驟
//1.建立本身的類;
//2.讓須要歸檔的類遵照NSCoding的協議.
//在須要歸檔的類的.m文件中實現NSCoding協議方法
//3.在合適的地方將本身的類的對象進行歸檔
//a.建立一個對象
//b.建立一個歸檔工具NSKeyedArchiver
//c.使用歸檔工具對對象進行歸檔
//d.結束歸檔;
//e.將數據寫入本地文件中
//並非全部的類均可以進行歸檔,類的對象能夠進行歸檔和
//解歸檔的前提是遵照NSCoding協議,Z
#import <Foundation/Foundation.h>
#import "FJIdol.h"
#define path @"/Users/IOS1601/Desktop/plist文件/idolData"
//歸檔
void achiver();
//解歸檔
void deAchiver();
int main(int argc, const char * argv[]) {
@autoreleasepool {
deAchiver();
}
return 0;
}
#pragma mark 歸檔
void achiver(){
//1.建立一個對象
FJIdol *idol = [[FJIdol alloc] initWithName:@"鹿晗"
sex:@"男" score:100 face:100];
//2.建立一個歸檔工具
//參數:一個可變的二進制對象
NSMutableData *mdata = [[NSMutableData alloc] init];
NSKeyedArchiver *achiver = [[NSKeyedArchiver alloc]
initForWritingWithMutableData:mdata];
//3.使用歸檔工具對對象進行歸檔
//achiver調用當前方法的時候,會自動去調用類中的協議方法;
//將idol的屬性歸檔;方法調用結束後,idol的數據會存到mdata中
[achiver encodeObject:idol forKey:@"idol"];
//4.關閉歸檔工具
[achiver finishEncoding];
//5.將數據寫入本地文件中
[mdata writeToFile:path atomically:NO];
}
#pragma mark 解歸檔
//先去實現解歸檔的對象的類的NSCoding協議方法的解歸檔方法
void deAchiver(){
//1.建立一個NSData去獲取歸檔保存的二進制文件裏面的內容;
NSData *data = [[NSData alloc] initWithContentsOfFile:path];
//2.建立一個解歸檔工具
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]
initForReadingWithData:data];
//3.解歸檔
//注意:解歸檔和歸檔時候方式和key值一致
//在這裏也會自動去調用NSCoding中解歸檔相關的協議方法;
FJIdol *idol = [unarchiver decodeObjectForKey:@"idol"];
[unarchiver finishDecoding];
NSLog(@"%@",idol);
}