// 原始數據
NSArray *list = @[@{@"name":@"奈何",@"age":@180,@"height":@180}];
// 取到原始數據的某一條數據
NSDictionary *info = list[0];
// 把獲取下來的這條數據轉換成model
Model *model = [[Model alloc] init];
// 把這條數據key對應的值,賦給model的屬性
model.name = info[@"name"];
// 把獲取下來的值轉換成對應的屬性
model.age = [info[@"age"] integerValue];
//
model.height = [info[@"height"] floatValue];
*/
/*
// 讀取plist文件裏面的內容
NSString *path = [[NSBundle mainBundle] pathForResource:@"Person" ofType:@"plist"];
NSArray *list = [NSArray arrayWithContentsOfFile:path];
NSMutableArray *array = [NSMutableArray array];
for (NSDictionary *info in list) {
Model *user = [[Model alloc] init];
user.name = info[@"name"];
user.age = [info[@"age"] integerValue];
user.height = [info[@"height"]floatValue];
// 把轉換好的model添加到以後要使用的數組裏面
[array addObject:user];
}
Model *one = array[0];
NSLog(@"%@ %ld %f",one.name,one.age,one.height);
*/
/* NSString *path = [[NSBundle mainBundle] pathForResource:@"Person" ofType:@"plist"];
NSArray *list = [NSArray arrayWithContentsOfFile:path];
NSMutableArray *userList = [NSMutableArray array];
for (NSDictionary *info in list) {
Model *user = [[Model alloc] initWithUserInfo:info];
// 把賦值的方法移動到構造方法裏面
user.name = info[@"name"];
[userList addObject:user];
}
*/
/*
NSString *path = [[NSBundle mainBundle] pathForResource:@"Person" ofType:@"plist"];
NSArray *list = [NSArray arrayWithContentsOfFile:path];
NSMutableArray *userList = [NSMutableArray array];
for (NSDictionary *info in list) {
// 把初始化model對象的方法隱藏到類方法(modelWithUserInfo)裏面
Model *user = [Model modelWithUserInfo:info];
[userList addObject:user];
}
*/
#pragma mark-----------------------------------
/*
歸檔->數據持久化的方式->加密(把文件加密,不是把數據加密)。
歸檔分爲存儲數據(編碼的過程、或叫序列化的過程、或歸檔過程)。
讀取數據(解碼、反序列化、解歸檔)。
可以歸檔的對象:必須遵守歸檔協議,實現協議方法。纔可以進行歸檔。
歸檔:NSCoding
除了NSObject未實現歸檔協議,其他實現了協議的類都可以歸檔(UIView、UIViewController、UIImage...)
歸檔的類名:NSKeyedArchiver
解歸檔類名:NSKeyedUnarchiver
歸檔、解歸檔都是通過key來歸檔和解歸檔的
在歸檔和解歸檔的時候key一定要對應,儘量和對象名相同
*/
// 歸檔的步驟
//1、寫歸檔存儲文件的路徑
//2、準備要歸檔的數據
//3、開始歸檔
/*
//1、寫歸檔存儲文件的路徑
NSArray *serchList = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
// 歸檔文件的尾綴儘量.archiver
NSString *path = [[serchList lastObject] stringByAppendingPathComponent:@"list.archiver"];
//2、準備要歸檔的數據
NSArray *list = @[@{@"name":@"奈何",@"age":@180,@"height":@180}];
//3、開始歸檔
// + (BOOL)archiveRootObject:(id)rootObject toFile:(NSString *)path;
// 把一個支持object(支持歸檔)類型的數據,以歸檔的形式存儲到指定位置
// 支持歸檔協議的對象,系統幫忙對他進行了編碼
BOOL isSuccess = [NSKeyedArchiver archiveRootObject:list toFile:path];
if (isSuccess) {
NSLog(@"%@",path);
}
*/
/*
// 解歸檔的步驟
// 1、歸檔文件的路徑
// 2、開始解歸檔
// 1、歸檔文件的路徑
NSArray *serchList = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
// 歸檔文件的尾綴儘量.archiver
NSString *path = [[serchList lastObject] stringByAppendingPathComponent:@"list.archiver"];
// 2、開始解歸檔
NSArray *list = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
NSLog(@"%@",list);
// NSDictionary *dic = @{@"name":@"..."};歸檔到字典
*/
// NSData二進制的類,可以把文件或者數據轉換成二進制的對象
// NSMutableData
// NSDate時間的類
/*
歸檔多種數據
1、存儲路徑
2、初始化一個可變的二進制對象,同時準備要歸檔的數據
3、歸檔等待寫入數據的二進制對象(要使用歸檔的數據,對需要的歸檔的數據進行編碼)
4、使用歸檔對象,對要歸檔的數據進行編碼(編碼結束後同時寫入到二進制對象)
5、編碼結束(把編碼後的數據寫入到二進制數據《系統操作》現在二進制對象裏面已經存在編碼之後的數據
)
6、把二進制對象存儲到指定位置(歸檔成功)
*/
/*
// 1、存儲路徑
NSArray *searchList = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [[searchList lastObject] stringByAppendingPathComponent:@"user. archiver"];
// 2、 初始化一個可變的二進制對象,同時準備要歸檔的數據
// 準備要歸檔的數據
NSString *name = @"肖耐";
NSInteger age = 18;
float height = 180;
// 初始化一個可變的二進制對象
NSMutableData *data = [NSMutableData data];
// 3、歸檔等待寫入數據的二進制對象
// - (instancetype)initForWritingWithMutableData:(NSMutableData *)data
// 二進制文件等待寫入->讓歸檔對象幫他寫入(編碼結束,就會把編碼後的數據,寫入到二進制對象)
NSKeyedArchiver *arc = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
// 4、使用歸檔對象,對要歸檔的數據進行編碼(同是寫入到二進制對象)
// 編碼使用encode,解碼使用decode
// 要用對應的數據類型進行編碼
[arc encodeObject:name forKey:@"name"];
[arc encodeInteger:age forKey:@"age"];
[arc encodeFloat:height forKey:@"height"];
// 5、編碼結束。編碼結束之後,會把編碼之後的數據寫入到二進制對象
[arc finishEncoding];
// 6、把二進制對象存儲到指定位置(歸檔成功)
BOOL isSuccess = [data writeToFile:path atomically:YES];
if (isSuccess) {
NSLog(@"歸檔路徑=%@",path);
}
*/
/*
// 多重數據存到同一個歸檔文件解歸檔
// 1、歸檔文件的路徑
// 2、使用data 讀取數據準備解歸檔data裏面的數據
// 3、解歸檔數據,用對應的數據類型接收
// decode解碼
// - (instancetype)initForReadingWithData:(NSData *)data;
// NSData *readData = [[NSData dataWithContentsOfFile:path];
// 2、使用data 讀取數據準備解歸檔data裏面的數據
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:[NSData dataWithContentsOfFile:path]];
// 3、解歸檔數據,用對應的數據類型接收
NSString *name = [unarchiver decodeObjectForKey:@"name"];
NSInteger age = [unarchiver decodeIntegerForKey:@"age"];
float height = [unarchiver decodeFloatForKey:@"height"];
NSLog(@"%@ %ld %f",name,age,height);
*/
/*
自定義歸檔:有些數據不能歸檔,歸檔必須遵守歸檔協議(NSCoding)
歸檔、解歸檔都與第一種方式相同
*/
//歸檔在使用歸檔的方法的時候,會調用這個協議方法
- (void)encodeWithCoder:(NSCoder*)aCoder{
// aCoder就是系統傳過來的NSKeyedArchiver實例化出來的對象
[aCoder encodeObject:self.nameforKey:@"name"];
[aCoder encodeInteger:self.ageforKey:@"age"];
[aCoder encodeFloat:self.heightforKey:@"height"];
}
//解歸檔的時候會自動調用initWithCoder
- (nullable instancetype)initWithCoder:(NSCoder*)aDecoder{
// 只要是構造方法,先把創建對象的方法補全
self = [super init];
if (self) {
// 當使用解歸檔方法的時候系統會自動調用initWithCoder:(NSCoder *)aDecoder。系統會自動幫咱們創建一個對象。之前對象數據保存在歸檔文件裏面,在解歸檔的時候,還原數據並且把還原的數據賦值給這個對象->現在這個對象的數據,跟原來歸檔時候的數據是一樣的。
self.name= [aDecoder decodeObjectForKey:@"name"];
self.age= [aDecoder decodeIntegerForKey:@"age"];
self.height= [aDecoder decodeFloatForKey:@"height"];
}
return self;
user.name = @"鳳輕塵";
user.age = 160;
user.height = 163;
NSString *path = [NSHomeDirectory()stringByAppendingPathComponent:@"user.archiver"];
BOOL isSuccess = [NSKeyedArchiver archiveRootObject:user toFile:path];
if (isSuccess) {
NSLog(@"%@",path);
}
UserModel *nowUser = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
NSLog(@"%@ %ld %f",nowUser.name,nowUser.age,nowUser.height);
}