iPhone-在NSUserDefaults中存储值是否有限制?

我是iPhone开发和objective C的新手。我已使用NSUserDefaults在我的应用程序中存储了一些值。但是我不知道在NSUserDefaults中存储值是否有限制。谁能帮我知道这一点。

提前致谢。

9个解决方案
47 votes

只要iPhone / iPad上有足够的空间,您就可以存储NSUserDefault值。 所有这些值都存储在.plist文件中,并且此文件非常小,大多数情况下小于1 kb(除非您存储大量数据)。

answered 2019-10-07T21:50:49Z
42 votes

您可以存储什么类型有限制:它们都必须都是属性列表对象,即NSUserDefaultsNSNumberNSDataNSArrayNSDictionary。此外,如果值也是属性列表对象,则只能存储NSArrayNSDictionary; 同样,NSDictionary的所有键都必须是字符串。

请注意,像NSUserDefaults这样的对象不在上面的列表中。 因此,如果要将颜色存储在默认数据库中,则需要先将其转换为字符串或数据对象,然后在读取默认值时将其转换回。

至于大小限制,没有任何记录,但是请注意,所有数据都将存储为属性列表文件。 整个文件将作为一个整体读取和写入,因此,如果使用NSUserDefaults存储仅部分更改的大量数据,那么您将浪费大量时间进行不必要的I / O。

benzado answered 2019-10-07T21:51:30Z
8 votes

每个人都回答了“有极限吗?”这个直接问题。 但是,我发现此线程确实希望了解“要在UserDefaults中存储多少存储空间?”

如果您正在寻找答案,这是一个有用的话题。 我发现有帮助的响应是转到您的项目文件,并查看plist文件的大小:

5个对象几乎一无所有。 你会没事的!


在我的机器上,我的用户默认值中有大约28兆数据。 这根本不会引起任何问题。


根据数组的一般编程经验,我猜想当达到1000时,性能会开始迅速下降,具体取决于元素的大小。 因此,在一个程序中,存储数百个元素不会有问题。 这表示我可能会开始使用sqlite3数据库或coredata,如果我是您,则宜早而不晚于。

重要提示:

上面的内容减轻了我对我越来越多的默认值(现在大约为20-25)会引起问题的担忧。 我已经使用CoreData了,所以我正在考虑使用哪个,因为允许的用户首选项/自定义数目越来越长。 因此,我将保留用户默认设置。

但是,正如其他答案所指出的,该文件将作为一个整体进行读取和写入。 因此,阅读20个键/字符串字典和5个键/布尔字典只是为了检索一个字符串...并非完全理想。 但是,如果它不影响性能并且为您节省了大量代码,那为什么不呢?

Dave G answered 2019-10-07T21:52:43Z
4 votes

在NSUserDefaults中存储值没有限制。

Manmay answered 2019-10-07T21:53:09Z
4 votes

NSData中唯一的存储限制是设备存储容量。

NSData设备中,有尽可能多的可用存储空间,您实际上可以在NSData中存储数据。键值对存储在xml结构化文件(.plist)中,该文件存储在App Bundle中。

用户默认系统和键值存储均设计用于   存储简单的数据类型-字符串,数字,日期,布尔值,   URL,数据对象等(在属性列表中)。 使用一个   属性列表还意味着您可以使用   数组和字典类型。 也可以存储其他对象   首先将它们编码为NSData对象,以将其添加到属性列表中。

  • 关于用户默认系统
Adromil Balais answered 2019-10-07T21:53:57Z
4 votes

正如许多人已经提到的那样:我不知道将数据存储在.plist中(例如UserDefaults)的任何SIZE限制(物理内存除外)。 因此,这不是如何的问题。

真正的问题应该是您如何经常编写新的/更改的值...这与写入将导致的电池消耗有关。

如果更改单个值,IOS就没有机会避免物理写入“磁盘”,只是为了保持数据完整性。 关于UserDefaults,这将导致整个文件重写到磁盘。

这会为“磁盘”加电,并使其保持更长的供电时间,并防止IOS进入低功耗状态。

摘自《 iOS应用能源效率指南》:

最小化数据写入。 仅在文件内容更改时才写入文件,并尽可能将更改汇总到单个写入中。 如果仅更改了几个字节,请避免写出整个文件。 如果您经常更改大文件的一小部分,请考虑使用数据库来存储数据。

READS没问题,因为所有值都缓存在内存中。

Hardy_Germany answered 2019-10-07T21:55:03Z
4 votes

来自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


    // ....
 }   


摘要

  1. 当前本地用户默认值没有限制
  2. 在tvOS上,警告通知将以512kB发布,并且进程以1MB终止。
  3. 对于无处不在的默认设置,该限制取决于登录的iCloud用户。
AechoLiu answered 2019-10-07T21:55:51Z
2 votes

据我所知,在NSUserdefaults中存储没有限制。

Tendulkar answered 2019-10-07T21:56:17Z
0 votes

无论驱动器上允许的最大文件大小如何。 您可以使用这段代码进行检查!

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *myKey = @"key";
int sizeOfFile = 1024; // Fill in proper file size here
NSData myObject;
NSString *someFilePath = @"PathToYourFileHere";

for(int i = 1; i < 9999999999999999; i++)
{
  myObject = [NSData dataWithContentsOfFile:someFilePath];
  [defaults setObject:myObject forKey:[NSString stringWithFormat:@"%@%i", myKey, i]];
  NSLog(@"Iteration: %i, TotalWritten: %i", i, i * sizeOfFile);
}
Esqarrouth answered 2019-10-07T21:56:44Z
translate from https://stackoverflow.com:/questions/7510123/is-there-any-limit-in-storing-values-in-nsuserdefaults