NSUserDefaults  的用法

来源:互联网 发布:分布式 java 编辑:程序博客网 时间:2024/06/06 07:24

一、了解NSUserDefaults以及它可以直接存储的类型

  关于NSUserDefaults的用法探究,缘起同事开发所遇到的问题向我探究所致。NSUserDefalts  适合存储轻量级的数据,一般来说存用户的账号密码,以及比较重要的个人信息如开发中用到的登录用户的Id。
      但是有时候我们会想要保存一个对象信息到NSUserDefalts里面,我们会发现我们的程序可能在存储对象的一行崩掉,所以 要想实现这种情况,那么我们首先要对NSUserDefalts的基本用方法进行了解。
          NSUserDefaults是一个单例,在整个程序中只有一个实例对象,他可以用于数据的永久保存,而且简单实用,这是它可以让数据自由传递的一个前提,也是大家喜欢用它保存简单数据的一个主要原因。
     在使用NSUserDefalts之前,我们要认识下NSUserDefalts可以存储哪些类型的数据,请看下面:
NSUserDefalts支持的数据类型:
    • NSData
    • NSString
    • NSNumber
    • NSDate
    • NSArray
    • NSDictionary

把自己想要存储的数据对应object  再用一个key值进行标识,

将数据取出也很简单,只需要取出key 对应的值就好了,代码如下


经过自己的验证,无论是可变的NSMutableArray  还是NSMutableDictionary  等等  只要是存储进NSUerDefalts 再取出来的时候,数据都会变成不可变类型

所以需要注意的是: NSUserDefaults 存储的对象全是不可变的这一点非常关键,弄错的话程序会出bug
切记:如果存进去的是可变数据类型,取出来的时候一定要再转成可变类型(如果你还想对数据类型进行添加删除的话)

如可变数组的取法:




二、使用 NSUserDefaults 存储自定义对象

1、将自定义类型转换为NSData类型
     当数据重复而且多的时候(例如想存储全班同学的学号,姓名,性别(这个数据量可能太大了 )),如果不用SQLite 存储 (多数据最好还是用这个),你可以选择使用归档,再将文件写入本地,但是这种方式和 NSUserDefaults 比起来麻烦多了(因为NSFileManage 本来就挺复杂) ,但是问题是,NSUserDefaults 本身不支持自定义对象的存储,不过它支持NSData的类型,下面举一个例子来介绍。

先建立一个SYIntendMajorModel 的类 类里面有两个属性(专业名字,专业Id)如图:

我们现在要做的是把SYIntendMajorModel 对象编程NSData 类型,那么首先必须要实现归档:这里要实现在.h文件中实现NSCoding  协议,再在.M中实现encodeWithCoder 方法  和initWithCoder 方法就可以了:

在.m中实现以下代码:
这样的话就可以吧自定义类型转变为NSData 类型了


2、将自定义类型数据存入 NSUserDefaults 中

存一个专业信息如:


取出自定义对象信息


同理如果要存入很多专业信息的话 ,将自定义的对象转成NSData格式存入数组里面,最后把数组存入NSUserDefalts
再存入NSUserDefalts 中得时候建议
苹果文档的解释:Writes any modifications to the persistent domains to disk and updates all unmodified persistent domains to what is on disk.  中文意思也就是:把任何更改的数据写进持久性域的磁盘并且更新磁盘上还没有改变的数据。
Because this method is automatically invoked at periodic intervals, use this method only if you cannot wait for the automatic synchronization (for example, if your application is about to exit) or if you want to update the user defaults to what is on disk even though you have not made any changes.

NSUserDefaults偶尔不工作,无法保存改动的数据的原因是,NSUserDefaults的机制是,过一段时间(periodic interval),会自动调用自己的函数synchronize去同步数据的

如果你改动数据后,就退出程序了(for example, if your application is about to exit),即在NSUserDefaults还没来得及synchronize之前就退出程序,就需要手动调用synchronize去保存数据了。

即,一般来说,手动调用NSUserDefaults去执行同步synchronize的动作,以及时保存(修改了的)数据。

NSUserDefautls将数据存储在什么地方了?
用NSUserDefaults存储的数据下次程序运行的时候依然存在,它把数据存储在什么地方了?如何能够清除?

其实它存储在应用程序内置的一个plist文件里,这个可以根据路径看到。
比如说这个是你的程序沙盒位置
/Users/DHX/Library/Developer/CoreSimulator/Devices/CB0C4278-C139-48BA-855D-B704FF21D83F/data/Containers/Data/Application/F39D6A7E-8A7A-423F-B57B-E11AC86E5578(这个对应模拟器上的地址)
这个下面有/Library/Prefereces,里面有个plist文件,存储的就是你的userDefaults
想要删掉的话,用removeObjectForKey或者删掉沙盒,也就是你的应用程序然后重新安装。


  暂时就这么多,以后还会继续补充

1 0
原创粉丝点击