一:plist存储,存储在Caches文件夹下
存储的路径:  沙盒路径/Library/Caches文件/文件名
 
    // 1.plist存储,生成一个plist文件.
    // 2.plist不是数组就是字典,plist存储就是用来存储字典或者数组.
    //  注意:Plist不能存储自定义对象
    //  创建数组
@[@"123",@1,@"abc"];
     
    // 存储数据,存储应用沙盒(应用的文件夹中)
     
    //  获取沙盒路径
     // NSLog(@"%@",NSHomeDirectory());
    //  直接应用沙盒中Caches文件路径
    // directory:获取哪个文件夹
    // domainMask:在哪个范围内搜索,NSUserDomainMask:表示在用户的手机上查找
    // expandTilde:是否展开全路径 YES:表示展开全路径 NO:不会展开全路径,会把应用沙盒的路径用波浪号(~)代替
     
    //  获取到Caches文件夹路径
YES)[0];
     
    //  拼接文件名
@"/arr.plist"];
     
    // File:文件的全路径
YES];
 
二:偏好设置存储在Preferences文件夹下:
存储的路径:  沙盒路径/Library/Preferences文件/文件名
// 偏好设置存储
// 好处:1> 
可以存储基本数据类型
快速进行键值对存储
 
// 获取偏好设置存储对象单例
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 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
{
@"name"];
@"age"];
}
 
// 什么时候调用:当一个对象要解档的时候就会调用这个方法解档
// 作用:告诉苹果当前对象中哪些属性需要解档
// initWithCoder什么时候调用:只要解析一个文件的时候就会调用
NScoding协议:加载xib或者Story Board的控件的时候就会调用initWithCoder方法
- (id)initWithCoder:(NSCoder *)aDecoder
{
// 当父类遵守了NScoding协议的时候需要调用父类的[super initWithCoder]方法
 #warning  [super initWithCoder]
if (self = [super
// 解档
        // 注意一定要记得给成员属性赋值
@"name"];
@"age"];
    }
    return  self;
}
 
 
// 什么时候调用:当一个对象要归档的时候就会调用这个方法归档
// 作用:告诉苹果当前对象中哪些属性需要归档
- (void)encodeWithCoder:(NSCoder *)aCoder
{
@"name"];
@"age"];
}
 
// 什么时候调用:当一个对象要解档的时候就会调用这个方法解档
// 作用:告诉苹果当前对象中哪些属性需要解档
// initWithCoder什么时候调用:只要解析一个文件的时候就会调用
- (id)initWithCoder:(NSCoder *)aDecoder
{
 #warning  [super initWithCoder]
if (self = [super
// 解档
        // 注意一定要记得给成员属性赋值
@"name"];
@"age"];
    }
    return  self;
}