一:plist存储,存储在Caches文件夹下
//存储的路径: 沙盒路径/Library/Caches文件/文件名
// 1.plist存储,生成一个plist文件.
// 2.plist不是数组就是字典,plist存储就是用来存储字典或者数组.
// 注意:Plist不能存储自定义对象
// 创建数组
NSArray *arr = @[@"123",@1,@"abc"];
// 存储数据,存储应用沙盒(应用的文件夹中)
// 获取沙盒路径
// NSLog(@"%@",NSHomeDirectory());
// 直接应用沙盒中Caches文件路径
// directory:获取哪个文件夹
// domainMask:在哪个范围内搜索,NSUserDomainMask:表示在用户的手机上查找
// expandTilde:是否展开全路径 YES:表示展开全路径 NO:不会展开全路径,会把应用沙盒的路径用波浪号(~)代替
// 获取到Caches文件夹路径
NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
// 拼接文件名
NSString *filePath = [cachePath stringByAppendingPathComponent:@"/arr.plist"];
// File:文件的全路径
[arr writeToFile:filePath atomically:YES];
二:偏好设置存储在Preferences文件夹下:
//存储的路径: 沙盒路径/Library/Preferences文件/文件名
// 偏好设置存储
// 好处:1> 不用关心文件路径
2> 可以存储基本数据类型
3> 快速进行键值对存储
// 获取偏好设置存储对象单例
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
// 存储对象
[userDefaults setObject:@5 forKey:@"age"];
// 存储基本数据类型
[userDefaults setInteger:10 forKey:@"num"];
三:归档
// 归档:存储自定义对象
// 存储路径:沙盒/temp文件名/文件名
// 创建person
Person *p = [[Person alloc] init];
p.age = 18;
p.name = @"a";
// 获取tem文件夹路径
NSString *tempPath = NSTemporaryDirectory();
// 拼接文件名
NSString *filePath = [tempPath stringByAppendingPathComponent:@"person.data"];
// NSKeyedArchiver专门用来做自定义对象归档
[NSKeyedArchiver archiveRootObject:p toFile:filePath];
// p encodeWithCoder:
// 解档
// 获取tem文件夹路径
NSString *tempPath = NSTemporaryDirectory();
// 拼接文件名
NSString *filePath = [tempPath stringByAppendingPathComponent:@"person.data"];
// 解档
Person *p = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
需给自定义的对象遵守NScode协议,并实现下面两个方法
// 什么时候调用:当一个对象要归档的时候就会调用这个方法归档
// 作用:告诉苹果当前对象中哪些属性需要归档
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:_name forKey:@"name"];
[aCoder encodeInt:_age forKey:@"age"];
}
// 什么时候调用:当一个对象要解档的时候就会调用这个方法解档
// 作用:告诉苹果当前对象中哪些属性需要解档
// initWithCoder什么时候调用:只要解析一个文件的时候就会调用
/ / 延伸:UIView遵守了NScoding协议:加载xib或者Story Board的控件的时候就会调用initWithCoder方法
- (id)initWithCoder:(NSCoder *)aDecoder
{
// 当父类遵守了NScoding协议的时候需要调用父类的[super initWithCoder]方法
#warning [super initWithCoder]
if (self = [super init]) {
// 解档
// 注意一定要记得给成员属性赋值
_name = [aDecoder decodeObjectForKey:@"name"];
_age = [aDecoder decodeIntForKey:@"age"];
}
return self;
}
// 什么时候调用:当一个对象要归档的时候就会调用这个方法归档
// 作用:告诉苹果当前对象中哪些属性需要归档
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:_name forKey:@"name"];
[aCoder encodeInt:_age forKey:@"age"];
}
// 什么时候调用:当一个对象要解档的时候就会调用这个方法解档
// 作用:告诉苹果当前对象中哪些属性需要解档
// initWithCoder什么时候调用:只要解析一个文件的时候就会调用
- (id)initWithCoder:(NSCoder *)aDecoder
{
#warning [super initWithCoder]
if (self = [super init]) {
// 解档
// 注意一定要记得给成员属性赋值
_name = [aDecoder decodeObjectForKey:@"name"];
_age = [aDecoder decodeIntForKey:@"age"];
}
return self;
}