NSDictionary数据密钥允许的最大大小是多少?即:
256字节,1024字节等
答案 0 :(得分:1)
NSDictionary
中的键或值没有本身的大小限制,正如其他人指出的那样,仅存储对键和值对象的引用,并且引用是通常是4或8个字节。对象的大小主要受(虚拟)内存大小的限制。
但是,正如您的评论所示,这似乎不是您的实际问题。相反,您担心字典的磁盘表示可能不会导致性能问题。将非常大的文件读入内存需要花费时间,您可以轻松读取数兆字节,而字典中的一些“小图形”不太可能成为问题。
使用plist不是您的最佳选择 - 这些是非常有限的一组数据类型的序列化表示,NSImage
例如不是其中之一,更适合其他用途。您应该查看标准的Cocoa归档类,它们将处理任何实现NSCoding
的类,并且许多标准类包括集合(NSDictionary
,NSArray
等)和图像。阅读Archives and Serializations Programming Guide。
HTH
答案 1 :(得分:0)
NSDictionary Key没有以字节为单位的最大大小限制。
如果您打算询问NSDictionary值的最大限制,那么可能没有这样的限制。
NSDictionary的关键唯一性由NSObject的hash
方法决定。
<强>更新强>
如果您希望获得字典访问的快速性,并且如果您想要保留数据,那么双层方法可能对您有用。在这种方法;
首先,数据存储在NSMutableDictionary
中,然后在后台将其推送到plist文件中。它看起来像这样。
在.h文件中,声明
NSMutableDictionary *userDictionary;
然后在.m文件中,定义像这样的方法,
- (void)storeValue:(id)value forKey:(id)key {
[userDictionary setValue:value forKey:key];
[self commitIntoPlist];
}
-(id)getValueForKey:(NSString *)key{
return [userDictionary objectForKey:key];
}
- (void)removeObjectForKey:(NSString *)key {
[userDictionary removeObjectForKey:key];
[self commitIntoPlist];
}
//commit the data into plist
- (void)commitIntoPlist {
dispatch_once(&onceCommitToken, ^{
commitQueue = dispatch_queue_create([@"com.yourappname.commit" cStringUsingEncoding:NSUTF8StringEncoding], DISPATCH_QUEUE_CONCURRENT);
});
dispatch_async(commitQueue, ^{
//here write the dictionary into plist
[self writeDictionaryIntoPlistFile:userDictionary];
});
}
使用这种方法可以获得字典的速度和Plist的持久性。您可以将此类保持为单例,并且在使用之前不要忘记分配NSMutableDictionary
。
答案 2 :(得分:0)
NSDictionary
中的键和值是id
类型的对象项。它们作为指针存储在内部,具有固定的大小。没有任何对象“太大”无法放入NSDictionary
。
(如果要将字典序列化为plist,则需要确保字典仅保留the data types that can be serialized for you。)
答案 3 :(得分:0)
NSDictionary中的东西必须是对象。由于对象总是通过引用而不是值存储,因此对象的大小根本不重要。
如果你需要在Foundation集合中存储任意数据但不认为对象包装器是值得的,那么NSValue和NSData通常是你最好的选择。