Joh*_*tty 63 iphone xcode objective-c nsuserdefaults ios
我是iPhone开发的新手objective C.我曾经NSUserDefaults在我的应用程序中存储了一些值.但我不知道如果存储值有任何限制NSUserDefaults.任何人都可以帮助我知道这一点.
提前致谢.
小智 50
只要iPhone/iPad上有足够的空间,您就可以存储NSUserDefault值.所有这些值都存储在.plist文件中,并且此文件非常小,大部分时间都在1 kb以下(除非您存储大量数据).
ben*_*ado 44
还有你可以存储什么类型的限制:它们必须属性列表对象,即NSString,NSNumber,NSData,NSArray,和NSDictionary.此外,您只能存储NSArray,NSDictionary如果值也是属性列表对象; 此外,NSDictionary必须是字符串的所有键.
请注意,类似的对象UIColor不在上面的列表中.因此,如果要在默认数据库中存储颜色,则需要先将其转换为字符串或数据对象,然后在读取默认值时将其转换回来.
就大小限制而言,没有任何文档记录,但请注意,所有数据都将存储为属性列表文件.整个文件作为一个整体读入和写出,因此如果您使用NSUserDefaults存储大量仅在部分中更改的数据,则会浪费大量时间进行不必要的I/O.
Aec*_*Liu 13
来自 iOS SDK 代码,以及相关的 Apple 官方文档。.
extension UserDefaults {
/*!
NSUserDefaultsSizeLimitExceededNotification is posted on the main queue when more data is stored in user defaults than is allowed. Currently there is no limit for local user defaults except on tvOS, where a warning notification will be posted at 512kB, and the process terminated at 1MB. For ubiquitous defaults, the limit depends on the logged in iCloud user.
*/
@available(iOS 9.3, *)
public class let sizeLimitExceededNotification: NSNotification.Name
// ....
}
Run Code Online (Sandbox Code Playgroud)
每个人都回答了"有限制吗?"的直接问题.但是,我发现这个帖子真的很容易理解" 在UserDefaults中存储多少太多了?"
如果您正在寻找答案,这里有一个有用的主题.我发现有用的响应是转到您的项目文件并查看plist文件大小:
5件物品几乎没有.你会没事的!
在我的机器上,我的用户默认值中有大约28兆的数据.这根本不会造成任何问题.
从数组的一般编程经验来看,我猜想当你进入1000时,性能开始迅速衰减,具体取决于元素大小.因此,在程序中,我不会存在存储几百个元素的问题.这说我可能会开始使用sqlite3数据库或coredata,如果我是你,我可能会更早而不是更晚.
重要的是要记住:
上述内容缓解了我的担忧,即我越来越多的违约(现在约20-25)会引起问题.我已经使用了CoreData,所以我正在考虑使用哪个,因为我允许的用户偏好/自定义数量增长很长.所以,我将保留用户默认值.
但是,正如其他答案所指出的那样,该文件将作为一个整体进行读写.所以读取20个键/字符串字典和5个键/布尔字典只是为了检索一个字符串...不完全理想.尽管如此,如果它没有损害性能并且它为您节省了大量代码,为什么不呢?
从 iPadOS 13.1 beta 3 开始,我现在在尝试存储更大的对象(图像)时看到以下消息。
2019-09-14 11:01:29.634368+0100 MyApp[1686:147223] [用户默认值] CFPrefsPlistSource<0x283c7d980>(域:com.example.MyApp,用户:kCFPreferencesCurrentUser,Container:ByHost:需要刷新:否):尝试在此平台上的 CFPreferences/NSUserDefaults 中存储 >= 4194304 字节的数据无效。这是 MyApp 或其使用的库中的错误
然而,检索密钥似乎仍然有效。
正如许多人已经提到的:我不知道将数据存储在 .plist(例如 UserDefaults)中的任何 SIZE 限制(物理内存除外)。所以这不是多少的问题。
真正的问题应该是你多久写入新的/更改的值......这与写入会导致电池消耗有关。
如果单个值更改,IOS 没有机会避免物理写入“磁盘”,只是为了保持数据完整性。关于 UserDefaults 这会导致整个文件重写到磁盘。
这会为“磁盘”加电并使其保持通电更长时间,并防止 IOS 进入低功耗状态。
摘自“iOS 应用能效指南”:
尽量减少数据写入。仅在文件内容发生更改时写入文件,并尽可能将更改汇总为一次写入。如果只有几个字节发生了变化,请避免写出整个文件。如果您经常更改大文件的一小部分,请考虑改用数据库来存储数据。
读取没有问题,因为所有值都缓存在内存中。
编辑:(2019 年 7 月):我刚刚找到了 Jeffry Fulton 的这篇非常好的博客文章。
https://jeffreyfulton.ca/blog/2018/02/userdefaults-limitations-and-alternatives
他详细描述了用户默认值的不同方面,还写了一些性能测试。
编码快乐!!!
| 归档时间: |
|
| 查看次数: |
27466 次 |
| 最近记录: |