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. docker 基本原理及快速入门

    作者地址:青牛 什么是docker Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目.它基于 Google 公司推出的 Go 语言实现. 项目后来 ...

  2. 可进可退,jQuery图片、视频、flash播放插件prettyPhoto使用记录

    一.prettyPhoto简介 prettyPhoto是一款基于jquery的轻量级的lightbox图片播放浏览插件,它不仅支持图片,还同时支持视频.flash.YouTube.iframe和aja ...

  3. C#中Serializable序列化

    序列化就是是将对象转换为容易传输的格式的过程,一般情况下转化打流文件,放入内存或者IO文件 中.例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象,或 ...

  4. 根据百度API获得经纬度,然后根据经纬度在获得城市信息

    package com.pb.baiduapi; import java.io.BufferedReader; import java.io.IOException; import java.io.I ...

  5. VUE性能优化总结

    1.v-show,v-if 用哪个? 在我来看要分两个维度去思考问题: 第一个维度是权限问题,只要涉及到权限相关的展示无疑要用 v-if, 第二个维度在没有权限限制下根据用户点击的频次选择,频繁切换的 ...

  6. php过滤文字中的表情字符和mysql服务端对emoji的支持

    1.过滤emoji表情的原因 在我们的项目开发中,emoji表情是个麻烦的东西,即使我们可以能存储,也不一定能完美显示,因为它的更新速度很快:在iOS以外的平台上,例如PC或者android.如果你需 ...

  7. dubbo+maven多模块项目单元测试

    基本上就是记录各种报错的解决办法.基本上就是将散落在项目各个模块中的配置文件复制到测试模块中. 目录结构: ——src ——java ——test ——java ——DaoTest.java ——re ...

  8. linux环境中设置jacoco覆盖率

    cd /alidata1/admin/za-themis pkill -9 -f za-themis #CATALINA_HOME=/root/za-tomcat #CATALINA_BASE=/ro ...

  9. C#.NET常见问题(FAQ)-Combobox如何设置不可以编辑

    设置它的DropDownStyle为DropDownList即可     更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: http://i.youku.com/acetaohai123   ...

  10. php之快速入门学习-1

    貌似和JSP差不多! PHP 脚本可以放在文档中的任何位置. PHP 脚本以 <?php 开始,以 ?> 结束: <?php// PHP 代码?> PHP 文件的默认文件扩展名 ...