NSUserDefault 的使用
1、NSUserDefault的使用:
作用:NSUserDefaults类提供了一个与默认系统进行交互的编程接口。NSUserDefaults对象是用来保存,恢复应用程序相关的偏好设置,配置数据等等。默认系统允许应用程序自定义它的行为去迎合用户的喜好。你可以在程序运行的时候从用户默认的数据库中读取程序的设置。同时NSUserDefaults的缓存避免了在每次读取数据时候都打开用户默认数据库的操作。可以通过调用synchronize方法来使内存中的缓存与用户默认系统进行同步。
原理:NsUserDefault是用户轻量级的数据持久化,主要用于保存用户程序的配置等信息,以便下次启动程序后能恢复上次的设置。因为是写到了硬盘上,所以会出现用多了会造成系统浪费,内存占用过大等问题。
(1)、该数据实际上是以“键值对”形式保存的(类似于NSDictionary),因此我们需要通过key来读取或者保存数据(value)。
(2)、NSUserDefaults类提供了非常方便的方法来获取常用的类型,例如floats,doubles,intergers,Booleans,URLs。所以这也就是说我们可以存储NSData,NSString,NSNUmber,NSDate,NSArray,NSDictionary(目前有五种类型)这些实例。如果你想存储其他类型的对象,你要将其归档并创建一个NSData来实现存储。
(3)、从NSUserDefaults返回的值是不可改变的,即便是你在存储的时候使用的是可变的值。例如你使用mutable string做为“MyStringDefault”的值,当你做使用stringForKey:方法获取的值,这个值仍然是不可变的。
(4)、NSUserDefaults是单例,同时也是线程安全的
语法:
存储整型的例子:
1、获取一个NSUserDefaults引用:
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
2、保存数据
[userDefaults setInteger:1 forKey:@"segment"];
[userDefaults synchronize];
3、读取数据
int i = [userDefaults integerForKey:@"segment"];
存储其他数据类型的例子:
保存数据:保存UIcolor类型的,超出上面的5种数据类型,就要进行归档,把它们归档成data类型的数据之后再保存。
NSData *objColor = [NSKeyedArchiver archivedDataWithRootObject:[UIColor redColor]];
[[NSUserDefaults standardUserDefaults]setObject:objColor forKey:@"myColor"];
读取数据:
NSData *objColor = [[NSUserDefaults standardUserDefaults]objectForKey:@"myColor"];
UIColor *myColor = [NSKeyedUnarchiver unarchiveObjectWithData:objColor];
2、NSUserDefault的使用小技巧:
(1)、NSUserDefault保存的数据在程序没有关闭前能成功读取到,但是当应用程序重启之后,就无法读取到,原因就是数据没有即时写入。通过官方文档可以了解到,UserDefaults是根据时间戳定时的把缓存中的数据写入本地磁盘,而非即时写入。所以调用set方法之后数据有可能还没有写入磁盘,应用程序就已经终止了。保险起见,我们在对重要的数据保存时使用synchornize方法强制写入。但是也要注意,不用频繁的使用synchornize。
(2)、在使用NSUserDefault的时候,很多人以为:
[[NSUserDefaults standardUserDefaults] setObject:array forKey:@"testInfo"] ;
后就已经算存储好了,再通过
[[NSUserDefaults standardUserDefaults] objectForKey:@"testInfo"];
就可以取出刚刚存的数据。
其实正常情况下没有问题,但是当重起
程序,关键字testInfo对应的竟然是空,这是什么情况呢??
我看看NSUserDefaults的头文件,就会发现,其实还有另外一个方法:synchronize,数据即时写入。
如果我们在set后,执行下面的语句:
[[NSUserDefaults standardUserDefaults] synchronize];
那么就不会出现上面的取出数据为空的情况了。
完整代码如下:
//存入数据
NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];
[defaults setObject:@"111" forKey:@"t
est"];
//把数据写到硬盘上
[defaults synchronize];
//取出数据
NSString *testStr =[defaults objectForKey:@"test"];
NSLog(@"testStr is: %@",testStr);
3、NSUserDefault的一些实际使用:
在使用NSUserDefaults的时候,
先看下下面的代码
NSDictionary* defaults = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
NSLog(@"Defaults: %@", defaults);
是用来获取设备上的所有的NSUserDefaults的设置。
上面代码输出了
Defaults: {
AppleITunesStoreItemKinds = (
eBook,
document,
"software-update",
booklet,
"itunes-u",
newsstand,
artist,
podcast,
"podcast-episode",
software
);
AppleKeyboards = (
"zh_Hans-Pinyin@sw=Pinyin;hw=US",
"en_US@hw=US;sw=QWERTY"
);
AppleKeyboardsExpanded = 1;
AppleLanguages = (
"zh-Hans",en, fr, de, ja, nl, it, es, pt, "pt-PT", da, fi, nb, sv,ko,
"zh-Hant", ru, pl, tr,uk, ar, hr, cs, el, he,ro, sk,th, id,
"en-GB", ca, hu, vi
);
如果想单独看某个key的设置,例如:
NSArray *array = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleKeyboards"];
NSLog(@"Keyboards: %@", array);
会输出
AppleKeyboards = (
"zh_Hans-Pinyin@sw=Pinyin;hw=US",
"en_US@hw=US;sw=QWERTY"
);
在看下面的代码
if([[NSUserDefaults standardUserDefaults] objectForKey:@"message"]==nil){
[[NSUserDefaults standardUserDefaults] setObject:@"This_is_my_default_message" forKey:@"message"];
}
代码意思是判断NSUserDefaults的“message”key 在dictionaryRepresentation中是否存在,如果不存在就
设置“message”key为This_is_my_default_message。
在加上句[[NSUserDefaults standardUserDefaults] synchronize];,这样这个设置就存到默认参数中了。
也见过别人把默认参数的设置写到applicationDidFinishLaunching注册的,
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
NSDictionary *defaultValues = [NSDictionary dictionaryWithObjectsAndKeys:
@"This_is_my_default_message", @"message",
nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:defaultValues];
[[NSUserDefaultsController sharedUserDefaultsController] setInitialValues:defaultValues];
}
当然写到applicationDidFinishLaunching中注册和不写到里面效果是一样的,只是代码的优美问题。
NSUserDefault 的使用相关推荐
- 读写应用程序数据-NSUserDefault、对象归档(NSKeyedArchiver)、文件操作
ios中数据持久化存储方式一般有5种:NSUserDefault.对象归档(NSKeyedArchiver).文件操作.数据库存储(SQLite3).CoreData. 1.NSUserDefault ...
- NSUserDefault的使用
NSUserDefault的使用 NSUserDefaults用来存储类似用户的配置等一些比较小的数据. 一.创建NSUserDefaults对象 NSUserDefaults *userDefaul ...
- NSUserDefault
NSUserDefault是Cocoa提供的默认应用程序状态保持接口.它提供了简化的plist文件持久化方法.通过NSUserDefault类,你可以把用户首选项保存到plist文件中.到应用程序结束 ...
- 清理所有NSUserdefault数据
清理所有NSUserdefault数据 NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; NSDictiona ...
- iOS 数据持久化 NSUserDefault
每一个应用都有一个 NSUserDefaults 实例,向 NSUserDefaults 类发送 standardUserDefaults 消息可以得到该实例. NSUserDefaults 实例类似 ...
- iOS 使用NSUserdefault 保存自定义的 对象
一:NSUserDefaults支持的数据格式有:NSNumber(Integer.Float.Double),NSString,NSData,NSArray,NSDictionary,BOOL类型: ...
- iOS 偏好设置 NSUserDefault
NSUserDefaults类提供了一个与系统进行交互的编程接口,用来存储.恢复应用程序的偏好设置和配置数据等,适合存储轻量级的本地数据.比如保存一个登陆界面的数据,例如用户名.密码之类的. 如果使用 ...
- OC基本数据存储方式
/** 一,数据存储 常用方式(5种) 1,XML属性列表 -- 保存在Doucuments文件夹 2,偏好设置(NSUserDefault)-- Library/Preference 需要配合wri ...
- Swift学习总结【持续更新】
1. try.try?.try!的区别: try:需要用catch捕捉异常,如: do {let data = try encoder.encode(item) try data.write(to: ...
最新文章
- PowerShell过滤文件中的重复内容
- git同一项目使用多个远程仓库
- 华工智能车队--这里有一群热爱智能车的人
- 字典树(trie树)、后缀树
- 一个非典型产品经理的创业心得
- python从低到高排序_使用python对matplotlib直方图中的xaxis值从最低值到最高值排序...
- 经过 Webpack 处理过的 SAP Spartacus main.js
- 选择排序算法python
- 如何去除Druid数据监控广告?
- UOJ 7 NOI2014 购票
- python变量图片_在Python中向3D图添加第4个变量
- iOS 刘海屏 隐藏横条 home键
- C#中提供了三种类型的计时器的比较实验(转自百度文库)
- MASM8.0 下载安装方法
- Word批量转PDF/图片
- ftps软件android,透视相机软件ftp
- mysql重装系统后以前的数据_重装系统后 如何使用之前mysql数据
- 在编译humanoid_navigation相关软件包,出现 Error at /usr/share/cmake-3.5/Modules/FindPkgConfig.cmake:解决方案
- 小米公司在互联网的地位怎么样
- 浅谈Android中MVP模式用于实际项目中的问题与优化