介绍

一开始看学习iOS的时候,书上介绍说这是一种轻量级持久化数据的方法,可以用来保存用户设置及用户名、密码等。看Android的时候也是这样介绍sharedPreference的。现在想来当时真是yong&simple。

使用NSUserDefault的好处是不用自己创建、维护一份文件,全由系统帮你做,向其中读写内容也甚是方便。
虽然都介绍说这是一种轻量级的方法,但谁也不能拦着你往里面放大量数据。

NSUserDefault的大小理论上是磁盘有多大它就可以有多大。但如果每次都存放很多数据,并且频繁读写的话,也是很影响性能的。

位置

使用xcode进行开发的时候,可以用finder打开/Users/yourname/Library/Developer/CoreSimulator,进到里面,根据com.xxx.xxx.plist搜索一下就能找到相应的文件了。

什么时候会被删除

当用户卸载app的时候,该app的NSUserDefault对应的plist就一并被删除了。当然还原出厂设置以及刷机就更不在话下了。

使用什么存放用户名密码

大家都用keychain来存放用户名密码。当其实keychain是把东西都存在一个db中,这个db也是能被弄出来的,所以keychain也不是绝对安全的(特别是你明文存储o(╯□╰)o)。不过加个密也基本上够用了。

keychain的机制是,即使你删除了之后重装这个app,那么之前保存的用户名密码还是在的。

从NSUserDefault取值时的默认值

NSUserDefault里面只能存储不可变的对象或者是基础数据类型。不可变的对象即不带mutable关键字的,基础类型即int,BOOL,float,double

从NSUserDefault里取出某个不存在的关键字对应的值,如果使用objectForKey,那么取出来的是一个NSObject,默认是nil。取出之后可以判断是否为nil,来判断该关键字是否存储了对应值。

假如说先用objectForKey取出一个对象,再用boolValue将其转换为BOOL类型,如下图所示,那么得到的值是0.

objectForKey boolValue
打印出:

print result

如果是直接boolForKey从NSUserDefault里取值,那么结果如下图,默认值也是0。
boolForKey

打印出:

result

如何避免上方的情况

方法一:
不要直接把基础类型存放在NSUserDefault里面。取数据的时候尽量使用objectForKey,判断对象是否为nil。

方法二:
使用registerDefaults设置默认值。

registerDefaults调用的时候,会先check一下是否已经有相同的key,如果存在则不会将其覆盖.