在NSUserDefaults中存储值有没有限制?

我是iPhone开发和objective C新手。 我已经使用NSUserDefaults在我的应用程序中存储一些值。 但是我不知道如果在NSUserDefaults存储值有任何限制。 任何人都可以帮助我知道这一点。

提前致谢。

只要iPhone / iPad上有足够的空间,就可以存储NSUserDefault值。 所有这些值都存储在.plist文件中,而且这个文件非常小,大部分时间都在1 kb以下(除非存储大量数据)。

有什么types可以存储的限制:它们必须都是属性列表对象,即NSStringNSNumberNSDataNSArrayNSDictionary 。 此外,如果值也是属性列表对象,则只能存储NSArrayNSDictionary ; 另外, NSDictionary所有键都必须是string。

请注意,像UIColor这样的对象不在上面的列表中。 所以如果你想在默认数据库中存储一个颜色,你需要先将它转换成一个string或数据对象,然后在读取默认值时将其转换回来。

就尺寸限制而言,没有任何logging,但是请注意,所有数据都将作为属性列表文件进行存储。 整个文件是作为一个整体被读入和写出来的,所以如果你使用NSUserDefaults来存储大量的数据,而这些数据只是变化的部分,你将浪费大量的时间来做不必要的I / O。

每个人都回答了“是否有限制”的直接问题? 但是,我发现这个线程真的希望了解“在UserDefaults中存储多less东西?”

如果你正在寻找答案,这是一个有用的线程 。 我发现有用的回答是去你的项目文件,看看plist文件的大小:

5个物体几乎没有。 你会没事的!


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


从数组的一般编程经验来看,当数值达到1000时,性能开始迅速衰减,这取决于元素的大小。 因此,在一个程序中,我不会有一个存储几百个元素的问题。 这说我可能会开始使用sqlite3数据库或coredata,而不是以后如果我是你。

重要的是要记住:

以上减轻了我的担心,即我越来越多的违约(现在大约20-25)会造成问题。 我已经使用了CoreData,所以我正在考虑使用哪个版本,因为我允许的用户偏好/自定义数量正在增长。 所以,我会留在用户的默认值。

但是 ,正如其他答案指出的那样,文件将作为一个整体来读写。 所以阅读20键/string字典和5键/布尔字典只是为了检索一个string…不完全理想。 但是,如果它不损害性能,并且节省了大量的代码,为什么呢?

在NSUserDefaults中存储值没有限制

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

 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); } 

NSUserDefaults唯一的存储限制设备存储容量

尽pipeiOS 设备中有可用的存储空间 ,但实际上可以将数据存储在NSUserDefaults对存储在一个XML结构化文件( 。plist )中,该文件存储在App Bundle中

用户默认的系统和键值存储都被devise用于在属性列表中存储简单的数据types – string数字date布尔值, URLs数据对象等等。 使用属性列表还意味着您可以使用数组和字典types来组织您的偏好数据。 也可以通过将其编码到一个NSData对象中来将其他对象存储在属性列表中。

  • 关于用户默认系统

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