iOS:NSUserDefaults开发者文档解读、用法注意和代码实例

目录

开发者文档解读

使用注意事项

使用示例

附:iOS开发者文档英文原文


已经有许久未更新博文了,最近主要回到iOS应用开发的横向项目上,所以在视觉、算法等其他领域暂时还木有空更新。

开发者文档解读

NSUserDefaults是一个分层持久进程间(可选分布式)键值存储,是针对存储用户的设置而存在的一种优化手段。(NSUserDefaults是一个单例,在整个程序中只有一个实例对象,他可以用于数据的永久保存,而且简单实用,这是它可以让数据自由传递的一个前提,也是大家喜欢用它保存简单数据的一个主要原因。)

——NSUserDefaults适合存储轻量级的本地数据,一些简单的数据(NSString类型的)例如用户密码,偏好设置等,NSUserDefaults是首选的方法。

分层:NSUserDefaults有一个查找数据的位置列表,称为“搜索列表”。搜索列表由称为“套件标识符”或“域标识符”的任意字符串引用。查询时,NSUserDefaults会检查其搜索列表的每个条目,直到找到包含相关密钥的条目,或者搜索整个列表。列表是(注意:“当前主机当前用户”首选项未在iOS,watchOS和tvOS上实现,“任何用户”首选项通常对这些操作系统上的应用程序无用):

- 托管(“强制”)首选项,由配置文件或网络管理员通过mcx设置

- 命令行参数

- 云中当前域的首选项

- 当前主机中当前域(当前用户)的首选项

- 任何主机中当前域(当前用户)的首选项

- 通过-addSuiteNamed添加的首选项:

- 当前主机中当前用户的所有应用程序的全局首选项

- 在任何主机中,当前用户的所有应用程序的全局首选项

- 当前主机中所有用户的当前域的首选项

- 当前主机中所有用户的所有应用程序的全局首选项

- 使用-registerDefaults注册的首选项:

持久性:除非另有说明,否则存储在NSUserDefaults中的首选项会在重新启动和重新启动应用程序时保持不变。

——重启APP,持久化存储的数据不会丢失!

进程间:可以同时访问和修改多个进程的首选项(例如,在应用程序和扩展之间)。

可选地分发(目前仅在共享iPad for Students模式中支持):存储在用户默认值中的数据可以“无处不在”,即通过云在设备之间同步。无处不在的用户默认值会自动传播到登录到同一iCloud帐户的所有设备。当读取默认值时(通过 -  * ForKey:NSUserDefaults上的方法),在本地默认值之前搜索无处不在的默认值。无处不在的默认值上的所有操作都是异步的,因此如果从iCloud下载尚未完成,则可以返回已注册的默认值来代替普遍存在的默认值。无处不在的默认值在应用程序的默认配置文件中指定。

键值存储:NSUserDefaults存储由NSString键标识的属性列表对象(NSString,NSData,NSNumber,NSDate,NSArray和NSDictionary),类似于NSMutableDictionary。——只适合存储一些基本类对象,比如NSString,NSNumber等,自定义的类型要用归档(编码)存储方式。见下节。

针对存储用户设置进行了优化:NSUserDefaults适用于相对少量的数据,经常查询和偶尔修改。以其他方式使用它可能比使用更适合这些用途的解决方案更慢或使用更多内存。

 CoreFoundation中的“App”CFPreferences函数与NSUserDefaults执行的搜索列表相同。
 

对于存储在其中的任何密钥,可以使用Key-Value Observing观察NSUserDefaults。使用NSKeyValueObservingOptionPrior观察来自其他进程或设备的更改将表现得好像未指定NSKeyValueObservingOptionPrior。

使用注意事项

根据开发经验,总结一些使用时注意事项:

1、NSUserDefaults支持的数据类型有NSString、 NSNumber、NSDate、 NSArray、NSDictionary、BOOL、NSInteger、NSFloat等系统定义的数据类型,如果要存放其他数据类型或者自定义的对象(如自定义的类对象),则必须将其转换成NSData存储。即使对象是NSArray或NSDictionary,他们里面存储的元素的类型也应该是以上范围包括的

2、在进行自定义对象的归档时要实现NSCoding协议,不实现协议方法则抛出异常,类似于序列化与反序列话,获得的对象都是不一致的。

3、NSUserDefaults返回的值是不可改变的,即使存储的时候是可变的值。对相同的Key赋值约等于一次覆盖。

4、NSUserDefaults是定时把缓存中的数据写入磁盘的,而不是即时写入,为了防止在写完NSUserDefaults后程序退出导致的数据丢失,可以在写入数据后使用synchronize强制立即将数据写入磁盘。一定要做synchronize操作,否则数据是存不到NSUserDefaults里面去的:(新手经常在这里出问题,发现数据老存不进去)

[userDefault synchronize];

使用示例

    //先创建一个userDefault实例化对象
    NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];

    //保存数据:保存UIcolor类型的,超出上面的5种常见基本数据类型,就要进行编码,把它们归档成NSData类型的数据之后再保存。
    NSData *objColor = [NSKeyedArchiver archivedDataWithRootObject:[UIColor redColor]];
    [userDefault setObject:objColor forKey:@"myColor"];
    [userDefault synchronize];

    //读取数据:先用unarchiveObjectWithData解码,再提取。
    NSData *objColor = [[NSUserDefaults standardUserDefaults] objectForKey:@"myColor"];
    UIColor *myColor = [NSKeyedUnarchiver unarchiveObjectWithData:objColor];

附:iOS开发者文档英文原文

NSUserDefaults is a hierarchical persistent interprocess (optionally distributed) key-value store, optimized for storing user settings.
 
 Hierarchical: NSUserDefaults has a list of places to look for data called the "search list". A search list is referred to by an arbitrary string called the "suite identifier" or "domain identifier". When queried, NSUserDefaults checks each entry of its search list until it finds one that contains the key in question, or has searched the whole list. The list is (note: "current host   current user" preferences are unimplemented on iOS, watchOS, and tvOS, and "any user" preferences are not generally useful for applications on those operating systems):
 - Managed ("forced") preferences, set by a configuration profile or via mcx from a network administrator
 - Commandline arguments
 - Preferences for the current domain, in the cloud
 - Preferences for the current domain, the current user, in the current host
 - Preferences for the current domain, the current user, in any host
 - Preferences added via -addSuiteNamed:
 - Preferences global to all apps for the current user, in the current host
 - Preferences global to all apps for the current user, in any host
 - Preferences for the current domain, for all users, in the current host
 - Preferences global to all apps for all users, in the current host
 - Preferences registered with -registerDefaults:
 
 Persistent: Preferences stored in NSUserDefaults persist across reboots and relaunches of apps unless otherwise specified.
 
 Interprocess: Preferences may be accessible to and modified from multiple processes simultaneously (for example between an application and an extension).
 
 Optionally distributed (Currently only supported in Shared iPad for Students mode):  Data stored in user defaults can be made "ubiqitous", i.e. synchronized between devices via the cloud.  Ubiquitous user defaults are automatically propagated to all devices logged into the same iCloud account. When reading defaults (via -*ForKey: methods on NSUserDefaults), ubiquitous defaults are searched before local defaults. All operations on ubiquitous defaults are asynchronous, so registered defaults may be returned in place of ubiquitous defaults if downloading from iCloud hasn't finished. Ubiquitous defaults are specified in the Defaults Configuration File for an application.
 
 Key-Value Store: NSUserDefaults stores Property List objects (NSString, NSData, NSNumber, NSDate, NSArray, and NSDictionary) identified by NSString keys, similar to an NSMutableDictionary.
 
 Optimized for storing user settings: NSUserDefaults is intended for relatively small amounts of data, queried very frequently, and modified occasionally. Using it in other ways may be slow or use more memory than solutions more suited to those uses.

 The 'App' CFPreferences functions in CoreFoundation act on the same search lists that NSUserDefaults does.
 
 NSUserDefaults can be observed using Key-Value Observing for any key stored in it. Using NSKeyValueObservingOptionPrior to observe changes from other processes or devices will behave as though NSKeyValueObservingOptionPrior was not specified.

其他参考资料:

https://www.jianshu.com/p/46532d448972

https://blog.csdn.net/summer_csdn123/article/details/72765056

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值