創(chuàng)建一個 Person 類
//定義基本屬性
@property(nonatomic,strong)NSString *name;
@property(nonatomic,strong)NSString *gender;
@property(nonatomic,assign)int age;
1,首先,復(fù)雜對象所屬的類要遵循<NSCoding>協(xié)議
@interface Person : NSObject<NSCoding>
2,-(void)encodeWithCoder:(NSCoder *)aCoder;序列化/歸檔
/歸檔(序列化)
//對person對象進(jìn)行歸檔時,此方法執(zhí)行
//對person中想要進(jìn)行歸檔的所有屬性,進(jìn)行序列化操作
-(void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeObject:self.gender forKey:@"gender"];
[aCoder encodeInt:self.age forKey:@"age"];
}
3:-(instancetype)initWithCoder:(NSCoder *)aDecoder;反序列化
//反歸檔(反序列化)
//對person對象進(jìn)行反歸檔時,該方法執(zhí)行
//創(chuàng)建一個新的person對象,所有屬性都是通過反序列化得到
-(instancetype)initWithCoder:(NSCoder *)aDecoder
{
if (self = [super init]) {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.gender = [aDecoder decodeObjectForKey:@"gender"];
self.age = [aDecoder decodeIntForKey:@"age"];
}
return self;
}
復(fù)雜對象寫入文件
#pragma mark --復(fù)雜對象寫入文件
-(void)archiver
{
Person *per = [Person new];
per.name = @"小美眉";
per.gender = @"女";
per.age = 18;
//準(zhǔn)備路徑:
NSString *path = NSHomeDirectory();
NSLog(@"%@",path);
path = [path stringByAppendingPathComponent:@"singeGirl.txt"];
//1:準(zhǔn)備存儲數(shù)據(jù)的對象
NSMutableData *data = [NSMutableData data];
//2:創(chuàng)建歸檔對象
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
//3:開始?xì)w檔
[archiver encodeObject:per forKey:@"person"];
//4:完成歸檔
[archiver finishEncoding];
//5:寫入文件當(dāng)中
BOOL result = [data writeToFile:path atomically:YES];
if (result) {
NSLog(@"歸檔成功:%@",path);
}else
{
NSLog(@"歸檔不成功!!!");
}
#pragma mark --- 反歸檔/反序列化/解碼/解檔 ----
//準(zhǔn)備解檔路徑
NSData *myData = [NSData dataWithContentsOfFile:path];
//創(chuàng)建反歸檔對象
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:myData];
//反歸檔
Person *aper = [Person new];
aper = [unarchiver decodeObjectForKey:@"person"];
//完成反歸檔
[unarchiver finishDecoding];
//測試
NSLog(@"%@",aper.name);
NSLog(@"%@",aper.gender);
}
Foundation框架對象 歸檔
-(void)foundationClassArchiver
{
//獲取文件路徑
NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
//
NSString *filePath = [documentPath stringByAppendingPathComponent:@"archiverFile"];
//歸檔
NSArray *archiverArray = @[@"小蘿莉",@"小正太",@"UI",@"OC"];
BOOL result = [NSKeyedArchiver archiveRootObject:archiverArray toFile:filePath];
if (result) {
NSLog(@"歸檔成功:%@",filePath);
}else
{
NSLog(@"歸檔失敗");
}
//反歸檔
NSArray *unarchiverArr = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
NSLog(@"%@",unarchiverArr);
}
對自定義的內(nèi)容進(jìn)行歸檔
//獲取文件路徑
NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
//在document文件夾下,創(chuàng)建新的文件
NSString *filePath = [documentPath stringByAppendingPathComponent:@"customFile"];
//1:使用Data對象進(jìn)行歸檔
NSMutableData *archiverData = [NSMutableData data];
//2:創(chuàng)建歸檔對象
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:archiverData];
//3:自己定義數(shù)據(jù)內(nèi)容(數(shù)據(jù)內(nèi)容以鍵值對的形式存在)
[archiver encodeObject:@"尼古拉斯.趙四" forKey:@"ZS"];
[archiver encodeObject:@[@"愛新覺羅",@"努爾哈赤",@"葉赫那拉"] forKey:@"name"];
[archiver encodeInt:28 forKey:@"age"];
//4:完成歸檔
[archiver finishEncoding];
//5:寫入
BOOL result = [archiverData writeToFile:filePath atomically:YES];
if (result) {
NSLog(@"歸檔成功:%@",filePath);
}
//反歸檔
//1:讀取文件,生成NSData類型
NSData *unarchiverData = [NSData dataWithContentsOfFile:filePath];
//2:創(chuàng)建反歸檔對象
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:unarchiverData];
//3:反歸檔.根據(jù)可以訪問
NSString *ZS = [unarchiver decodeObjectForKey:@"ZS"];
NSLog(@"%@,%@",ZS,filePath);
NSUserDefaults
-(void)writeNSUserDf
{
/*
NSUserDefaults是一個單例,在整個應(yīng)用程序當(dāng)中只有一個實(shí)例對象,他可以用于數(shù)據(jù)的永久保存,簡單實(shí)用,這是它可以讓數(shù)據(jù)自由傳遞的一個前提.
NSUserDefaults:它可以存儲一些類型的數(shù)據(jù):NSNumber,NSString,NSData,NSArray......
*/
// NSUserDefaults
NSArray *arrays = @[@"橘子",@"香蕉",@"西瓜",@"草莓",@"大蘋果"];
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
//存
[user setObject:arrays forKey:@"userarrays"];
//取
NSArray *strings = [user objectForKey:@"userarrays"];
NSLog(@"%@",strings);
#warning 注意:對相同的key賦值約等于一次覆蓋,要保證每一個key的唯一性
// NSUserDefaults 存儲的對象完全是不可變的(這一點(diǎn)十分關(guān)鍵,如果弄錯會出現(xiàn)bug),例如,如果我想要存儲一個NSMutableArray對象.我必須先創(chuàng)建一個不可變數(shù)組(NSArray),然后在去存入
NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"123",@"456",@"789", nil];
NSArray *array = [NSArray arrayWithArray:mutableArray];
NSUserDefaults *user2 = [NSUserDefaults standardUserDefaults];
[user2 setObject:array forKey:@"我們這里存放的一定是不可變的"];
//自定義數(shù)據(jù)類型存儲到NSUserDefaults
Person *per = [Person new];
per.name = @"小白";
per.age = 14;
per.gender = @"男";
//創(chuàng)建存放person的數(shù)組
NSMutableArray *dataArray = [NSMutableArray arrayWithCapacity:0];
//將person類型轉(zhuǎn)換成為NSData類型
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:per];
//將data存入到數(shù)組當(dāng)中
[dataArray addObject:data];
NSUserDefaults *user1 = [NSUserDefaults standardUserDefaults];
[user1 setObject:data forKey:@"person"];
NSLog(@"%@",user1);
//取出數(shù)據(jù)
NSUserDefaults *user3 = [NSUserDefaults standardUserDefaults];
NSData *data3 = [user3 objectForKey:@"person"];
Person *per3 = [NSKeyedUnarchiver unarchiveObjectWithData:data3];
NSLog(@"%@",per3);
}