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 的使用的更多相关文章

  1. plist文件、NSUserDefault 对文件进行存储的类、json格式解析

    ========================== 文件操作 ========================== Δ一 .plist文件 .plist文件是一个属性字典数组的一个文件: .plis ...

  2. NSUserDefault的使用

    NSUserDefaults 在我们编写代码中是最常用的一个永久保存数据的方法,也是最简单的. 使用NSUserDefault需要注意: 1.数据的本地化保存不是实时的,如果需要实时保存,调用sync ...

  3. 【IOS】ios中NSUserDefault与android中的SharedPreference用法简单对比

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3405308.html 有Android开发经验的朋友对Shar ...

  4. iOS页面间传值的方式(NSUserDefault/Delegate/NSNotification/Block/单例)

    iOS页面间传值的方式(NSUserDefault/Delegate/NSNotification/Block/单例) 实现了以下iOS页面间传值:1.委托delegate方式:2.通知notific ...

  5. iOS开发——数据持久化Swift篇&(一)NSUserDefault

    NSUserDefault //******************** 5.1 NSUserDefault和对象归档 func useNSUserDefault() { //通过单利来创建一个NSU ...

  6. NSUserDefault 的使用(好东东,留着)

    1.NSUserDefault的使用: 作用:NSUserDefaults类提供了一个与默认系统进行交互的编程接口.NSUserDefaults对象是用来保存,恢复应用程序相关的偏好设置,配置数据等等 ...

  7. 【转】iOS页面间传值的方式(Delegate/NSNotification/Block/NSUserDefault/单例)-- 不错

    原文网址:http://www.cnblogs.com/JuneWang/p/3850859.html iOS页面间传值的方式(NSUserDefault/Delegate/NSNotificatio ...

  8. 读写应用程序数据-NSUserDefault、对象归档(NSKeyedArchiver)、文件操作

    ios中数据持久化存储方式一般有5种:NSUserDefault.对象归档(NSKeyedArchiver).文件操作.数据库存储(SQLite3).CoreData. 1.NSUserDefault ...

  9. 不建议使用NSUserDefault存储大量数据

    NSUserDefaults 其实是一个 plist 文件(有待验证),即使只是修改一个 key 都会 load 整个文件,不适合存储大量数据. NSUserDefaults是保存成文本格式的,容易被 ...

  10. iOS页面间传值的方式 (Delegate/NSNotification/Block/NSUserDefault/单例)

    iOS页面间传值的方式(Delegate/NSNotification/Block/NSUserDefault/单例)   iOS页面间传值的方式(NSUserDefault/Delegate/NSN ...

随机推荐

  1. mongodb实现远程连接

    mongodb远程连接配置分为以下4步: 1. 添加管理员账户 > use admin switched to db admin > db.addUser('tank','test'); ...

  2. GPU/CUDA程序初体验 向量加法

    现在主要的并行计算设备有两种发展趋势: (1)多核CPU. 双核,四核,八核,...,72核,...,可以使用OpenMP编译处理方案,就是指导编译器编译为多核并行执行. (2)多线程设备(GP)GP ...

  3. unity opaque sort

    https://docs.unity3d.com/ScriptReference/Rendering.OpaqueSortMode.html unity对opaque的排序 tbdr下不排序 其它由近 ...

  4. linux系统用户下的crontab任务不执行问题处理

    需求:需要每一天对数据库做一个备份,oracle数据库,linux系统. 备份命令采用最简单的导出\导入. 首先确认服务器是否开启任务计划服务,只有root用户才能对crond服务进行开启和关闭 [r ...

  5. Linux上磁盘挂载

    Linux磁盘挂载   一.  磁盘分区 在终端输入fdisk –l 命令查看整个系统的分区情况. 能够看到另一个32G的/dev/vdb磁盘没有挂载使用 watermark/2/text/aHR0c ...

  6. unity3d插件Daikon Forge GUI 中文教程-3-基础控件Button和Sprite的使用

    (游戏蛮牛首发)大家好我是孙广东.官网提供了专业的视频教程http://www.daikonforge.com/dfgui/tutorials/,只是是在youtube上.要观看是须要FQ的. 只是教 ...

  7. Linux中如何开启8080端口供外界访问

    装好Tomcat7后,发现除了本机能访问外界访问不了,岂有此理.于是请教百度大神,在费一番周折后,总结步骤如下: 1.修改文件/etc/sysconfig/iptables [root@bogon ~ ...

  8. Objective-C中NSString与int和float的相互转换

    NSString *tempA = @"123"; NSString *tempB = @"456"; 1,字符串拼接 NSString *newString ...

  9. 使用web_url注意Resource的选项

    在使用web_url的时候,一定注意Resource的使用,一般最好使用Resource=0,如果使用Resource=1,那么一定要修改配置. Resource Attribute If Resou ...

  10. line-height测量及使用

    1.line-height定义 line-height表示行高,即两行文字基线间的距离. 以下是图示说明: 行高是2条红线之间的距离,即:1+2+3+4 在实际测量中,基线不好找,可测量顶线到顶线的距 ...