1.属性列表plist存储
/*
plist只能存储是写入到Documents目录下且只能是系统自带的一些常规的类,也就是有writeToFile方法的对象才可以使用plist保存数据
字符串/字典/数据/NSNumber/NSData
...
自定义的对象不能保存到plist中
*/
/** * 点击保存按钮 */ - (IBAction)saveDataBtnClick:(id)sender { // NSUserDomainMask 在用户目录下查找 // YES 代表展开用户目录的~ // NSDocumentDirectory 查找Documents文件夹 NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; // 拼接文件路径 上面获取的文件路径加上文件名 NSString *path = [doc stringByAppendingPathComponent:@"abc.plist"]; NSLog(@"%@", path); /* plist只能存储系统自带的一些常规的类, 也就是有writeToFile方法的对象才可以使用plist保存数据 字符串/字典/数据/NSNumber/NSData ... */ // 自定义的对象不能保存到plist中 NSDictionary *dict = @{@"person": @"abc"}; [dict writeToFile:path atomically:YES]; } /** * 点击读取按钮 */ - (IBAction)readDataBtnClick:(id)sender { NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSString *path = [doc stringByAppendingPathComponent:@"abc.plist"] ; // 读取数据 NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path]; NSLog(@"%@", dict); }
属性列表-NSDictionary的存储和读取过程
2.偏好设置
偏好设置在 library目录下的preference中
<pre name="code" class="objc">- (IBAction)saveBtn:(id)sender { // 偏好设置是专门用来保存应用程序的配置信息的比如保存用户名、密码、字体大小等设置, 一般情况不要再偏好设置中保存其他数据 // 如果利用系统的偏好设置来存储数据, 默认就是存储在Preferences文件夹下面的 // 偏好设置会将所有的数据保存到同一个文件中 // 获取NSUserDefaults对象 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; // 保存数据(如果设置数据之后没有同步, 会在将来某一时间点自动将数据保存到Preferences文件夹下面) [defaults setObject:@"tinghou" forKey:@"name"]; [defaults setObject:@"man" forKey:@"gender"]; [defaults setInteger:13 forKey:@"age"]; [defaults setDouble:10.1 forKey:@"height"]; // 让NSUserDefaults立刻保存数据 注意:UserDefaults设置数据时,不是立即写入,而是根据时间戳定时地把缓存中的数据写入本地磁盘。所以调用了set方法之后数据有可能还没有写入磁盘应用程序就终止了。出现以上问题,可以通过调用synchornize方法强制写入 [defaults synchronize]; //如果要立刻保存就需要这行代码 } - (IBAction)readBtn:(id)sender { // 1.获取NSUserDefaults NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; // 2.通过NSUserDefaults获取保存的数据 NSString *name = [defaults objectForKey:@"name"]; int age = [defaults integerForKey:@"age"]; NSLog(@"%@", name); NSLog(@"%d", age); }
+(BOOL)isFirstOpen{ NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; BOOL firstOpen = [userDefaults boolForKey:@"firstOpen"]; return firstOpen; } +(void)setFirstOpen:(BOOL)b{ NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; [userDefaults setBool:b forKey:@"firstOpen"]; [userDefaults synchronize]; } +(BOOL)login{ NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; BOOL loginState = [userDefaults boolForKey:@"login"]; return loginState; } +(BOOL)setLogin:(BOOL)loginState{ NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; [userDefaults setBool:loginState forKey:@"login"]; [userDefaults synchronize]; return loginState; }
3.归档
如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,可以直接用NSKeyedArchiver进行归档和恢复
不是所有的对象都可以直接用这种方法进行归档,只有遵守了NSCoding协议的对象才可以
NSCoding协议有2个方法:
encodeWithCoder:
每次归档对象时,都会调用这个方法。一般在这个方法里面指定如何归档对象中的每个实例变量,可以使用encodeObject:forKey:方法归档实例变量
initWithCoder:
每次从文件中恢复(解码)对象时,都会调用这个方法。一般在这个方法里面指定如何解码文件中的数据为对象的实例变量,可以使用decodeObject:forKey方法解码实例变量
- (IBAction)saveBtnClick:(id)sender { // 1.创建对象 /* NJPerson *p = [[NJPerson alloc] init]; p.name = @"lnj"; p.age = 100; p.height = 1.76; */ NJStudent *stu = [[NJStudent alloc] init]; stu.name = @"lnj"; stu.age = 100; stu.height = 1.8; stu.weight = 60; // 2.获取文件路径 (获取文件路径方法和plist存储的一样) NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; //用上面获得的文件路径(document)加上文件名 拼接文件路径 NSString *path = [docPath stringByAppendingPathComponent:@"stu.xxoo"]; NSLog(@"path = %@", path); // 3.将自定义对象保存到文件中 // [NSKeyedArchiver archiveRootObject:p toFile:path]; [NSKeyedArchiver archiveRootObject:stu toFile:path]; } - (IBAction)readBtnClick:(id)sender { // 1.获取文件路径 NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSString *path = [docPath stringByAppendingPathComponent:@"stu.xxoo"]; // 2.从文件中读取对象 // NJPerson *p = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; NJStudent *stu = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; NSLog(@"%@ %d %.1f %.1f", stu.name, stu.age, stu.height, stu.weight); }
NSKeyedArchiver归档如果想将一个自定义对象保存到文件中必须实现NSCoding协议
时间: 2024-12-15 18:40:32