我是iPhone开发和objective C
的新手。
我使用NSUserDefaults
在我的应用中存储了一些值。
但我不知道如果在NSUserDefaults
中存储值有任何限制。
任何人都可以帮助我了解这一点。
提前致谢。
答案 0 :(得分:47)
只要iPhone / iPad上有足够的空间,您就可以存储NSUserDefault值。所有这些值都存储在.plist文件中,并且此文件非常小,大部分时间都在1 kb以下(除非您存储大量数据)。
答案 1 :(得分:42)
您可以存储的类型有限制:它们都必须是属性列表对象,即NSString
,NSNumber
,NSData
,NSArray
和{{1 }}。此外,如果值也是属性列表对象,则只能存储NSDictionary
和NSArray
;另外,NSDictionary
的所有键都必须是字符串。
请注意,NSDictionary
之类的对象不在上面的列表中。因此,如果要在默认数据库中存储颜色,则需要先将其转换为字符串或数据对象,然后在读取默认值时将其转换回来。
就大小限制而言,没有记录,但请注意,所有数据都将存储为属性列表文件。整个文件作为一个整体读入和写出,因此如果使用UIColor
存储大量仅在部分中更改的数据,则会浪费大量时间进行不必要的I / O. / p>
答案 2 :(得分:8)
每个人都回答了直接问题"是否有限制?"但是,我发现这个帖子真的想要理解" 多少来存储在UserDefaults中?"
如果您正在寻找答案,那么这里有用thread。我发现有用的响应是转到您的项目文件并查看plist文件大小:
5个对象几乎没有。你没事!
在我的机器上,我的用户默认值中有大约28兆的数据。这根本没有造成任何问题。
从数组的一般编程经验来看,当你进入1000时,我会猜测性能开始迅速衰减,具体取决于元素大小。因此,在程序中,我不会存在存储几百个元素的问题。这说我可能会开始使用sqlite3数据库或coredata,如果我是你的话,应该尽快而不是以后。
重要的是要记住:
以上缓解了我的担忧,即我越来越多的违约(现在约20-25)会引起问题。我已经使用了CoreData,所以我正在考虑使用哪个,因为我允许的用户偏好/自定义数量增长很长。所以,我将保留用户默认值。
然而,正如其他答案所指出的那样,该文件将作为一个整体进行读写。因此,阅读20个键/字符串词典和5个键/布尔词典只是为了检索一个字符串...不完全理想。尽管如此,如果它不会损害性能并且为您节省大量代码,为什么不呢?
答案 3 :(得分:4)
在NSUserDefaults中存储值没有限制..
答案 4 :(得分:4)
NSUserDefaults
中唯一的存储限制是设备存储容量。
iOS
设备中有存储空间,您实际上可以将数据存储在{{1 }}。 键 - 值对存储在xml结构化文件(。 plist )中,该文件存储在 App Bundle中 强>
用户默认系统和键值存储都是为其设计的 存储简单数据类型 - 字符串,数字,日期,布尔值, 在属性列表中 URL s,数据对象等等。使用一个 属性列表还表示您可以使用组织您的首选项数据 数组和字典类型。也可以存储其他对象 在属性列表中,首先将它们编码为
NSUserDefaults
对象。
答案 5 :(得分:4)
正如许多人已经提到的:我不知道在.plist中存储数据的任何SIZE限制(物理内存除外)(例如UserDefaults)。所以这不是一个多少的问题。
真正的问题应该是如何编写新的/更改的值...这与此写入将导致的电池消耗有关。
IOS没有机会避免物理写入"磁盘"如果单个值发生更改,只是为了保持数据完整性。关于UserDefaults,这会导致整个文件重写为磁盘。
这会打开"磁盘"并使其保持较长时间通电并防止IOS进入低功耗状态。
来自" iOS应用能源效率指南":
最小化数据写入。仅在内容发生更改时写入文件,并尽可能将更改聚合为单个写入。 如果只更改了几个字节,则避免写出整个文件。 如果经常更改大部分文件,请考虑使用数据库来存储数据。
READS没问题,因为所有值都缓存在内存中。
答案 6 :(得分:4)
来自iOS SDK代码和related Apple official document.。
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
// ....
}
答案 7 :(得分:2)
据我所知,在NSUserdefaults中存储没有限制。
答案 8 :(得分:1)
从iPadOS 13.1 beta 3开始,我现在在尝试存储较大的对象(图像)时看到以下消息。
2019-09-14 11:01:29.634368 + 0100 MyApp [1686:147223] [用户默认设置] CFPrefsPlistSource <0x283c7d980>(域:com.example.MyApp,用户: kCFPreferencesCurrentUser,ByHost:否,容器:(空),内容 是否需要刷新:否):尝试在其中存储> = 4194304字节的数据 此平台上的CFPreferences / NSUserDefaults无效。这是一个 MyApp或它使用的库中的错误
但是,检索密钥似乎仍然有效。
答案 9 :(得分:0)
无论驱动器上允许的最大文件大小是多少。您可以使用这段代码来查看它!
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);
}