博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NSUserDefault -- synchronize 浅析
阅读量:5462 次
发布时间:2019-06-16

本文共 2810 字,大约阅读时间需要 9 分钟。

NSUserDefault的使用比较简单:

NSUserDefaults *mySettingData = [NSUserDefaults standardUserDefaults];  
创建NSUserDefaults对象之后即可往里面添加数据,它支持的数据类型有NSString、 NSNumber、NSDate、 NSArray、NSDictionary、BOOL、NSInteger、NSFloat等系统定义的数据类型,如果要存放自定义的对象(如自定义的类对象),则必须将其转换成NSData存储:

NSArray *arr = [[NSArray alloc] initWithObjects:@"arr1", @"arr2", nil]  [mySettingData setObject:arr forKey:@"arrItem"]; [mySettingData setObject:@"admin" forKey:@"user_name"]; [mySettingData setBOOL:@YES forKey:@"auto_login"]; [mySettingData setInteger:1 forKey:@"count"];

@往NSUserDefaults添加数据后,它们就变成了全局的变量,App中即可读写NSUserDefault中的数据:

NSUserDefaults *mySetting = [NSUserDefaults standardUserDefaults];  NSLog(@"arrItem=%@", [mySetting objectForKey:@"arrItem"]); NSLog(@"user_name=%@", [mySetting objectForKey:@"user_name"]); NSLog(@"count=%d", [mySetting integerForKey:@"count"]);

@如果想删除某个数据项,可以使用removeObjectForKey删除数据:

[mySetting removeObjectForKey:@"arrItem"];  

@需要注意的是,NSUserDefaults是定时把缓存中的数据写入磁盘的,而不是即时写入,为了防止在写完NSUserDefaults后程序退出导致的数据丢失,可以在写入数据后使用synchronize强制立即将数据写入磁盘:

[mySetting synchronize];  

运行上面的语句后,NSUserDefaults中的数据即被写入到.plist文件中,如果是在模拟器上运行程序,可以在Mac的/Library/Prefereces目录下面找到一个文件名为com.apple.PeoplePicker.plist的plist文件,用Xcode打开该文件,可以看到刚才写入的数据。

@pragma mark -引导页只执行一次

if(![[NSUserDefaults standardUserDefaults] boolForKey:@"firstStart"]){           这一行-->加入引导页[self startYinDaoYe]        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"firstStart"]; [[NSUserDefaults standardUserDefaults] synchronize]; }

@系统定义的数据类型,NSUserDefault配合NSKeyedArchiver和NSKeyedUnarchiver做本地持久化

这里用数组做个举例:

static NSString  *const archiverKey = @"DataArray";- (void)_testNSKeyedArchiverAndNSKeyedUnarchiver { NSArray *setDataArray = @[@"1",@"2",@"3"]; NSData *archiverData = [NSKeyedArchiver archivedDataWithRootObject:setDataArray]; [[NSUserDefaults standardUserDefaults] setObject:archiverData forKey:archiverKey]; // 切莫忘记,依旧调用 synchronize 立即写入沙盒中 [[NSUserDefaults standardUserDefaults] synchronize]; NSArray *getDataArray = [NSArray new]; NSData *unarchiverData = [[NSUserDefaults standardUserDefaults] objectForKey:archiverKey]; getDataArray = [NSKeyedUnarchiver unarchiveObjectWithData:unarchiverData]; NSLog(@" getDataArray = %@",getDataArray); }

@切记,数组类型为NSArray的时候可以直接getDataArray = [NSKeyedUnarchiver unarchiveObjectWithData:unarchiverData]; 如果数组类型是NSMutableArray,则必须,getDataArray = [NSMutableArray arrayWithArray:[NSKeyedUnarchiver unarchiveObjectWithData:unarchiverData]]; 否则getDataArray为nil

@NSUserDefaults只支持: NSString, NSNumber, NSDate, NSArray, NSDictionary.

如果把一个自定义的类存到一个NSArray里,然后再存到NSUserDefaults里也是不能成功的。
那怎么办呢?
让这个自定义类实现协议中的

- (id) initWithCoder: (NSCoder *)coder方法

- (void) encodeWithCoder: (NSCoder *)coder方法,

然后把该自定义的类对象编码到NSData中,再从NSUserDefaults中进行读取。

具体可以回看我的-->数据持久化(一)序列化与反序列化

转载于:https://www.cnblogs.com/Jenaral/p/5535492.html

你可能感兴趣的文章
彻底删除mysql 分类: database 201...
查看>>
ARM指令集中立即数寻址的范围
查看>>
学习:关于oracle序列(sequence)组成的主键和唯一的字符串组成的主键在性能上如何?...
查看>>
用一道面试题考察对闭包的理解
查看>>
android中判断某个应用是否存在
查看>>
How to change SAPABAP1 schema password In HANA
查看>>
mimics教程中文版——第二章
查看>>
Go并发编程实践
查看>>
CSS margin详解
查看>>
cesium编程入门(三)开始使用cesium开发
查看>>
4.18n阶勒让德多项式求解
查看>>
RTMP协议分析及推流过程
查看>>
PAT天梯赛L1-054 福到了
查看>>
Pains and Sickness 学习笔记
查看>>
PHP变量测试函数
查看>>
第六天 基本文件管理与XFS文件系统备份恢复
查看>>
win10中强制vs2015使用管理员启动
查看>>
UISerachBar / UISearchDisplayController
查看>>
Linux常用的操作命令
查看>>
Redis Desktop Manager
查看>>