NSUserdefaults
也许比较常知晓的是:它是应用程序中一种很方便的数据持久化存储解决方案!
这里对它的内容做一个再度说明,主要从概念上来,有助于对它更深入的理解。
————
1. 运行时使用NSUserDefaults 对象从应用程序的用户默认数据库中读取数据。NSUserDefaults缓存信息可以避免每次需要设取值而频繁开起用户的默认数据库。synchronize() 方法,会自动周期性的调用,以保持缓存与用户默认数据库的数据同步,如果需要立即同步也可以手动调用。
2. NSUserDefaults 类,提供了便捷的存储数据的方法,但是default 对象必须是属性表的形式(即,需要是NSData, NSString, NSNumber, NSDate, NSArray, or NSDictionary)。如果需要存储的数据是其它类型的对象,那么需要将其归档从而创建成一个NSData的实例。
2.1 属性列表(Property List),由CF类型数据组成(CFString, CFNumber, CFBoolean, CFDate, and CFData),复杂的情况可以组合到CFDictionary 或 CFArray 中。属性列表的应用类型:CFPropertyListRef。关于property list参考( https://developer.apple.com/library/prerelease/content/documentation/CoreFoundation/Conceptual/CFPropertyLists/CFPropertyLists.html#//apple_ref/doc/uid/10000130i)
2.2 偏好效值(Preferences Utitlities),工程的偏好效值一般是用键值对的形式存储的,并关联用户名、应用程序ID、以及设备名。如此不同层级的用户可以保存或修改偏好值。
3. 几个注意点:
3.1. iOS 或者 OS 系统中,键值形式的文件(plist)用处很多,譬如属性列表,NSUserDefaults可以理解为一个内置的.plist文件,并且不可见,并且苹果建议NSUserDefaults用于存储小数据。注意,plist可不是NSUserDefaults,plist文件可以被创建存在于所有可以放置文件的地方,键值数据如果太大可以考虑使用plist文件或者使用CoreData。
3.2. 这个应用中全局的plist,一般情况下会存在于应用沙盒中(/Library/Preferces),也就是说不同app之间不能直接通过它进行数据共享。事非绝对,这个跟权限有关(UserDefault的作用域:domain),利用App Group实现app间数据共享也可以使用到它(参看app数据共享策略)。
3.3. 从NSUserDefaults取得的值是不可变的,譬如存入时候是keyarr:mutableArray,使用keyarr取出时候得到的数组是不可变的。(数据最终是存储在数据库中的,NSUserDefaults操纵和自动化组织这些数据的一个对象)
补充:
其实NSUserDefaults 底层操作API 是Core Fundation 框架下的API,它是线程安全的。但是还应该注意到它牵引出的几个概念:
a. 键值数据(key :value), 这个数据结构成就了以下:
b. plist 文件 | property list | 属性列表 , 这是苹果应用中最最常见的数据序列
c. 偏好效值(Preference Utilities),从工程配置文件数据形式看基本都是plist
d. Userdefault Domain, default 域这个可以理解就是数据权限问题,密切到数据安全问题。
参考文档:
// https://developer.apple.com/reference/foundation/nsuserdefaults
// http://oleb.net/blog/2014/02/nsuserdefaults-handling-default-values/