1、偏好设置—多用于用户名、是否自动登录等数据存储
很多iOS应用都支持偏好设置,比如保存用户名、密码、字体大小等设置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能
每个应用都有个NSUserDefaults实例(有切仅有一个),通过它来存取偏好设置,比如,保存用户名、字体大小、是否自动登录
(1)保存内容设置
1 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
// 将用户名存储 2 [defaults setObject:@"JFCK" forKey:@"username"];
// 将字体尺寸储存 3 [defaults setFloat:18.0f forKey:@"text_size"];
(2)读取上次保存的设置
1 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 2 // 读取username这个key的值 3 NSString *username = [defaults stringForKey:@"username"]; 4 // 读取text_size这个key的值
5 float textSize = [defaults floatForKey:@"text_size"];
6 // 读取auto_login这个key的值
7 BOOL autoLogin = [defaults boolForKey:@"auto_login"];
(3)注意:UserDefaults设置数据时,不是立即写入,而是根据时间戳定时地把缓存中的数据写入本地磁盘。所以调用了set方法之后数据有可能还没有写入磁盘应用程序就终止了。出现以上问题,可以通过调用synchornize方法强制写入
1 [defaults synchornize];
2、plist存储—字典、数组存储
(1) 数据储存:
1】获取Cache文件路径:
// 获取Cache文件路径
// NSSearchPathDirectory:搜索的目录
// NSSearchPathDomainMask:搜索范围 NSUserDomainMask:表示在用户的手机上查找
// expandTilde 是否展开全路径,如果没有展开,应用的沙盒路径就是~
// 存储一定要要展开路径
NSString *cachePaht = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
2】拼接文件名:
NSString *filePath = [cachePaht stringByAppendingPathComponent:@"Arr.plist"];
3】将信息写入文件:
// File:文件的全路径
[arr writeToFile:filePath atomically:YES];
示例:
1 - (void)saver { 2 // 如何判断一个对象能不能使用Plist,就看下有没有writeToFile 3 NSArray *arr = @[@"123",@1]; 4 // 获取Cache文件路径 5 // NSSearchPathDirectory:搜索的目录 6 // NSSearchPathDomainMask:搜索范围 NSUserDomainMask:表示在用户的手机上查找 7 // expandTilde 是否展开全路径,如果没有展开,应用的沙盒路径就是~ 8 // 存储一定要要展开路径 9 NSString *cachePaht = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0]; 10 // 拼接文件名 11 NSString *filePath = [cachePaht stringByAppendingPathComponent:@"Arr.plist"]; 12 // File:文件的全路径 13 [arr writeToFile:filePath atomically:YES]; 14 }
数据读取:
1 - (void)read { 2 // 获取Cache文件路径 3 NSString *cachePaht = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0]; 4 // 拼接文件名 5 NSString *filePath = [cachePaht stringByAppendingPathComponent:@"arr.plist"]; 6 NSArray *arr = [NSArray arrayWithContentsOfFile:filePath]; 7 NSLog(@"%@",arr); 8 }
3、NSKeyedArchiver归档解档(NSCoding)
如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,可以直接用NSKeyedArchiver进行归档和恢复;
不是所有的对象都可以直接用这种方法进行归档,只有遵守了NSCoding协议的对象才可以。
NSCoding协议有2个方法:
1、encodeWithCoder:
每次归档对象时,都会调用这个方法。一般在这个方法里面指定如何归档对象中的每个实例变量,可以使用encodeObject:forKey:方法归档实例变量。
2、initWithCoder:
每次从文件中恢复(解码)对象时,都会调用这个方法。一般在这个方法里面指定如何解码文件中的数据为对象的实例变量,可以使用decodeObject:forKey方法解码实例变量。
完整实例:存取联系人的名字、电话号码信息数据:
1、在数据模型的头文件中正常定义属性和声明类方法(实例化对象的方法)
1 #import <Foundation/Foundation.h> 2 3 @interface ICKContact : NSObject<NSCoding> 4 5 @PRoperty (nonatomic, strong) NSString *name; 6 7 @property (nonatomic, strong) NSString *phone; 8 9 + (instancetype)contactWithName:(NSString *)name andPhone:(NSString *)phone; 10 11 @end
2、在数据模型的实现文件中,除了实现实例化对象的类方法以外,还需从新实现实例化对象的对象方法和存储属性的方法:
1 #import "ICKContact.h" 2 3 @implementation ICKContact 4 // 实例化数据模型方法 5 + (instancetype)contactWithName:(NSString *)name andPhone:(NSString *)phone 6 { 7 ICKContact *contact = [[ICKContact alloc] init]; 8 contact.name = name; 9 contact.phone = phone; 10 return contact; 11 } 12 // 遵守归档协议需调用的方法 13 - (void)encodeWithCoder:(NSCoder *)aCoder 14 { 15 [aCoder encodeObject:self.name forKey:@"name"]; 16 [aCoder encodeObject:self.phone forKey:@"phone"]; 17 } 18 19 // 遵守归档协议需调用的方法 20 - (instancetype)initWithCoder:(NSCoder *)aDecoder 21 { 22 // super是否也实现(initWithCoder:aDecoder)方法,取决于父类super是否也遵守了NSCoding协议 23 if (self = [super init]) { 24 self.name = [aDecoder decodeObjectForKey:@"name"]; 25 self.phone = [aDecoder decodeObjectForKey:@"phone"]; 26 } 27 return self; 28 } 29 30 @end
3、存储数据:在需要存储数据的文件中实现
1 // 获取全路径 2 NSString *cache = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0]; 3 NSString *path = [cache stringByAppendingString:@"contacts.data"]; 4 // 以数组形式写入(底层中还是以一个一个对象的形式进行存储) 5 // self.contacts :数据模型数组(此处实现就省略了) 6 [NSKeyedArchiver archiveRootObject:self.contacts toFile:path];
4、获取数据:
1 NSString *cache = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0]; 2 NSString *path = [cache stringByAppendingString:@"contacts.data"]; 3 _contacts = [NSKeyedUnarchiver unarchiveObjectWithFile:path];