为啥在 iOS 中使用 NSUserDefaults?
Posted
技术标签:
【中文标题】为啥在 iOS 中使用 NSUserDefaults?【英文标题】:Why is NSUserDefaults used in iOS?为什么在 iOS 中使用 NSUserDefaults? 【发布时间】:2012-02-06 19:05:23 【问题描述】:我是 ios 开发和移动应用程序开发的新手,我对要使用的 Objective C 和 MVC 模式有相当的了解,而且我从未做过任何 Mac 开发。
我很难理解NSUserDefaults
的用途?
我们已经有了像 PList 这样的东西,它将数据存储为 XML,我们有 SQLite
,它是用于此类设备的轻量级数据库。
那我们为什么要有它呢?
它是否是我们应用程序的替代简单键值存储,就像我们在云上拥有不同类型的存储(如 RDBMS 和基于键值的 NoSQL 存储等)一样?
对于NSUserDefaults
,Apple 文档说:-
“应用程序通过将值分配给用户默认数据库中的一组参数来记录此类偏好”
用户的默认数据库是什么意思?
我的猜测是,就像在任何多用户操作系统中一样,我们有不同的用户帐户,同样,在 Mac 中,我们可能有多个用户,每个用户都有一个数据库,应用程序将从该数据库中加载该用户保存的首选项.
那么,像 Mac OS X 一样,iOS 是否也有多个用户,并且取决于登录者NSUserDefaults
选择他/她的偏好?
如果我错了请告诉我。
【问题讨论】:
看看这个:jayprakashdubey.blogspot.in/2014/07/nsuserdefault-usage.html 【参考方案1】:还有一点还没有提到:NSUserDefaults 支持所有基本的标量(float、int、BOOL)类型,以及与 plist 兼容的类型:NSData、NSString、NSNumber、NSDate、NSArray 和 NSDictionary。 (您提到 plists 作为替代方案——NSUserDefaults 只是应用程序的 Preferences 文件夹中标准 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];
// error checking, tell UI to load the new values, etc...
(kDefaultsKeyModelObjects 是您在某处定义的字符串常量。始终将您的 NSUserDefaults 键放在一个位置!键名中的拼写错误可能需要数小时才能进行调试。:)
如果您使用例如 SQLite 来存储应用程序数据,则必须编写大量代码来将模型数据移入和移出数据库。如果您要处理大量数据、需要高效搜索等,这是有道理的;但如果它是网络应用程序中的服务器列表,则将它们放入 NSUserDefaults 中会更容易和更清晰。
最后一件事:NSUserDefaults 非常适合原型设计。即使你知道你最终会需要一个 SQLite 存储,你也可以开始使用 NSUserDefaults 作为一个快速简单的持久存储,并在编写一堆数据库代码之前让你的 UI 正常工作并充实你的数据模型。
所以像 Mac OS X 一样,iOS 是否也有多个用户并且取决于 无论哪个登录 NSUserDefaults 都会选择他/她的偏好?
不,在 iOS 上,默认 plist 位于应用程序的 Library/Preferences 文件夹中,而不是在 OS X 上的用户特定文件夹中。我无法想象 iOS 会有多个登录,但你永远不知道。如果是这样,他们就必须为不同的用户制作单独的默认 plist。
【讨论】:
【参考方案2】:NSUserDefaults 用于保存应用程序正常运行所依赖的小部分数据,而其他方法则适用于存储应用程序使用的大量数据。
NSUserDefaults 让您难以置信的简单,因为您不必担心文件、实体、获取……。这一切都在一行中完成。
【讨论】:
我在 NSUserDefaults 中存储了一些值,以便在重新启动应用程序时使用它。但是在重新启动应用程序很长时间后,我有时会得到零值。 这是一个问题吗?用所有相关代码编写一个新的,因为 NSUserDefaults 应该永久存储信息。【参考方案3】:它最初用于存储设置,但如果关于 SO 的问题有任何问题,它似乎确实被(ab)用于许多其他事情。它的“要点”在于它为广泛的数据类型提供了单行数据持久化和检索方法。
iOS 上没有内置于 NSUserDefaults 的多用户配置(还没有?)建立在相同的基础上,相同的类用于两个操作系统。
【讨论】:
因此 NSUserDefaults 在 MacOsX 中的作用是将设置作为键值存储在用户的默认数据库中,应用程序可以从中获取数据。但是告诉我,在 iOS 中只是一个简单的键值存储,因为只有一个用户,所以名称 NS"User"Defaults 这样的名称在这里没有意义吗?毫无疑问.. 它正在被(ab)使用:P 那么它在 iOS 中的用例到底是什么?抱歉有点傻,但我没有iphone。我在毕业时做了很多网络开发,并且必须在我的公司从事 iOS 工作。 这应该被选为正确答案。最初的问题:“所以像 Mac OS X 一样,iOS 是否也有多个用户,并且取决于登录的任何一个 NSUserDefaults 选择他/她的偏好?”没有从其他答案中解决。【参考方案4】:iOS 是单用户操作系统。因此,NSUserDefaults 在 OSX 和 iOS 中的使用方式不同。
在 iOS 中,您通常使用 NSUserDefaults 在“iOS 默认系统”上保存应用程序首选项和/或用户数据。即使您重新启动 iOS 设备,保存在默认系统中的数据也将始终保持不变。事实上,即使用户更新了应用程序。
您通常希望使用 NSUserDefaults 来保存应用程序首选项/设置。任何其他海量数据,例如游戏数据或实时计算,都应保存在文档目录下的 CoreData 或 sqllite 中。
【讨论】:
@AnkitJain 另一个线程表明这不是真的,除了故障:***.com/questions/1638766/…【参考方案5】:NSUserDefaults
仅为您的应用程序存储值。
注意 - 它并不是为了替代传统的数据存储(核心数据、SQLite、属性列表等用于存储应用程序数据)。 NSUserDefaults
用于特定键值对。
例如,一旦登录过程完成,我就使用它来存储经过身份验证的用户的网络 ID 和全名。在会话超时或注销时,我清除这些值。为此NSUserDefaults
闪耀。
【讨论】:
那么 NSUserDefaults 是一种应用程序会话的临时存储吗?与 Web 应用程序中的会话存储相同? 没有。 NSUserDefaults 用于持久存储。临时的完全相反。如果你希望你的数据一直都在那里,并且如果它很小,那么继续将它保存在 NSUserDefaults 中。假设您正在开发一个游戏,并且您的应用程序包含一个设置视图,供用户选择“昵称”、颜色、速度等选项,那么您应该使用 NSUserDefaults 来保存这些用户偏好。您也可以使用 plist 和 sql-lite,但大多数 iOS 开发人员建议的最佳做法是使用 NSUserDefaults 进行应用设置。以上是关于为啥在 iOS 中使用 NSUserDefaults?的主要内容,如果未能解决你的问题,请参考以下文章
带有 App Group 的 NSUserDefault 在 iOS 8 Beta3 中不起作用
IOS入门 SandBox Plist NSUserDefault
iOS 中 关于 NSUserDefault中存储可变数组的问题