还有一件事情尚未提及:NSUserDefaults支持所有基本的标量类型(float,int,BOOL),以及与plist兼容的类型:NSData,NSString,NSNumber,NSDate,NSArray和NSDictionary。(您已经提到了plist作为一种替代方案 - NSUserDefaults只是应用程序首选项文件夹中标准plist文件的前端。)这使得在几行代码中轻松创建应用程序状态的永久存储成为可能。更好的是,如果您在模型对象上实现了NSCoding,则可以将其归档为NSData并将它们放入NSUserDefaults:
NSData* data = [NSKeyedArchiver archivedDataWithRootObject:arrayOfModelObjects]
[[NSUserDefaults standardUserDefaults] setObject:data forKey:kDefaultsKeyModelObjects]
而且恢复应用程序数据也很简单,只需要
- (void)viewDidLoad
{
NSData* data = [[NSUserDefaults standardUserDefaults] objectForKey:kDefaultsKeyModelObjects];
arrayOfModelObjects = [[NSKeyedUnarchiver unarchiveRootObject:data] retain];
}
(kDefaultsKeyModelObjects是您在某个地方定义的字符串常量。始终将您的NSUserDefaults键放在一个地方!在键名中拼写错误可能需要花费数小时来调试。:)
如果您使用 SQLite 存储应用程序数据,那么就必须编写大量代码来移动模型数据进入和从数据库中出来。如果您处理大量数据、需要高效搜索等,则这是有意义的;但如果它仅仅是例如网络应用程序中的服务器列表,那么将其放入 NSUserDefaults 更加容易和清晰。
最后一件事:NSUserDefaults 适用于原型制作。即使您知道最终需要 SQLite 存储,您也可以开始使用 NSUserDefaults 作为快速简便的持久存储,让您的用户界面工作并完善数据模型之后,再编写大量的数据库代码。
那么像 Mac OS X 一样,iOS 是否也有多个用户,根据不同用户登录,NSUserDefaults 可以选择他/她的偏好设置吗?
不,iOS 中默认 plist 文件位于应用程序的 Library/Preferences 文件夹中,而不是像 OS X 中那样位于特定于用户的文件夹中。我无法想象 iOS 会有多个登录,但你永远不知道。如果确实有多个登录,则必须为不同的用户创建单独的默认 plist 文件。