NSUserDefault 的介绍

来源:互联网 发布:观察者软件 编辑:程序博客网 时间:2024/06/14 19:25

NSUserDefault 的介绍

NSUserDefaults类提供了与默认系统交互的编程接口。 默认系统允许应用程序自定义其行为以匹配用户的首选项。 例如,您可以允许用户自定义应用程序显示的测量单位或自动保存文档的频率。 应用程序通过将值分配给用户的默认数据库中的一组参数来记录此类首选项。 这些参数被称为默认值,因为它们通常用于在启动时或默认情况下确定应用程序的默认状态。

综述

在运行时,您可以使用NSUserDefaults对象从用户的默认数据库中读取应用程序使用的默认值。 NSUserDefaults缓存信息,以避免每次需要默认值时都打开用户的默认数据库。 它以周期性间隔自动调用的同步方法使内存中的缓存与用户的默认数据库保持同步,而不是即时写入的,为了防止在写完NSUserDefaults后程序退出导致的数据丢失,可以在写入数据后使用synchronize强制立即将数据写入磁盘:

[mySettingData synchronize];

NSUserDefaults类提供了访问常见类型(如浮点数,双精度,整数,布尔值和URL)的便利方法。 一个默认对象必须是一个属性列表,即一个实例(或用于集合,实例的组合):NSData,NSString,NSNumber,NSDate,NSArray或NSDictionary。 如果要存储任何其他类型的对象,通常需要将其归档以创建NSData实例。 下面是一个使用NSData的示例:

- (id)initWithCoder:(NSCoder *)coder  {     if(self = [super init]) {        // your code        self._firstName = [coderdecode ObjectForKey:@"_firstName"];                  self._lastName = [coderdecode ObjectForKey:@"_lastName"];          }       return self;  }  - (void)encodeWithCoder:(NSCoder *)coder  {    // your code    [coderencode Object:_firstNameforKey:@"_firstName"];          [coderencode Object:_lastNameforKey:@"_lastName"];      } BusinessCard *bc = [[BusinessCard alloc] init];  NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];NSData *udObject = [NSKeyedArchiverarchivedDataWithRootObject:bc];  // 将对象转换成NSData[udsetObject:udObjectforKey:@"myBusinessCard"];  udObject = nil;  udObject = [udobjectForKey:@"myBusinessCard"];//NSData转换成对象bc = [NSKeyedUnarchiverunarchiveObjectWithData:udObject] ;

从NSUserDefaults返回的值是不可变的,即使您将可变对象设置为值。 例如,如果将可变字符串设置为“MyStringDefault”的值,则稍后使用stringForKey检索的字符串将是不可变的。

为每个用户自动创建一个默认数据库。 NSUserDefaults类目前不支持每个主机的首选项。 为此,您必须使用CFPreferences API(请参阅首选项实用程序)。 但是,NSUserDefaults正确读取每个主机的首选项,因此您可以将CFPreferences代码与NSUserDefaults代码进行安全的混合。

NSUserDefaults为每个用户自动创建一个默认数据库。 NSUserDefaults类目前不支持每个主机的首选项。 为此,您必须使用CFPreferences API(请参阅首选项实用程序)。 但是,NSUserDefaults正确读取每个主机的首选项,因此您可以将CFPreferences代码与NSUserDefaults代码进行安全的混合。

从NSUserDefaults返回的值是不可变的,即使您将可变对象设置为值。 例如,如果将可变字符串设置为“MyStringDefault”的值,则稍后使用stringForKey检索的字符串将是不可变的。

如果您的应用程序支持托管环境,则可以使用NSUserDefaults对象来确定哪些首选项由管理员管理,以使用户受益。 受管理的环境有很多,比如在计算机实验室或教室,管理员或教师可能希望以特定方式配置系统。 在这种情况下,老师可以建立一套默认偏好,并强制用户使用这些偏好。 如果以这种方式管理首选项,则应用程序应阻止用户通过禁用任何适当的控件来编辑该首选项。

您可以使用键值观察来注册观察者以获取特定的感兴趣的密钥,以便通知本地默认数据库的所有更新。 有关详细信息,请参阅 Key-Value Observing Programming Guide。

NSUserDefaults类是线程安全的。

持久化NSURL和文件引用的URL

当使用NSURL实例引用进程中的文件时,重要的是区分基于位置的跟踪(文件:基本路径的方案URL)与文件系统身份跟踪(文件:作为文件引用URL的方案URL)。 当坚持久化NSURL时,您应该考虑到这一点。 如果您的应用程序通过其身份跟踪资源位置,以便在用户移动文件时可以找到该资源,那么您应该明确地写入NSURL书签数据或对文件引用URL进行编码。

如果要通过引用跟踪文件,但是您需要明确控制解决方案时,应注意将书签数据写入NSUserDefaults,而不是依赖于setURL:forKey:。 这允许您调用URLByResolvingBookmarkData:options:relativeToURL:bookmarkDataIsStale:error:当您知道您的应用程序将能够处理潜在的I / O或所需的用户界面交互时。

在 iCloud 中存储首选项

应用程序可以使用iCloud键值存储在用户的计算机或iOS设备上的首选项,通过这种方式可以与自己的其他设备共享少量数据。 例如,杂志应用程序可以存储用户正在读取的当前问题和页码,以便应用程序在不同的设备在启动时都可以打开到同一页面。

有关详细信息,请参阅 Preferences and Settings Programming Guide 中的 “Storing Preferences in iCloud” 文档。

沙箱注意事项

沙盒应用无法访问或修改任何其他应用的首选项。 (例如,如果您使用addSuiteNamed:方法添加其他应用的域名,你无法访问该应用的首选项。)

尝试访问或修改其他应用程序的首选项不会导致错误,但是当您执行此操作时,macOS实际上会读取和写入位于你的应用程序容器中的文件,而不是其他应用程序的实际首选项文件。

原创粉丝点击