什么是NSDictionary中的最大密钥长度?

时间:2010-06-10 22:28:40

标签: objective-c cocoa nsdictionary

我目前正在开发一个应用程序,它在表格中显示一堆文件,您可以添加和删除它们。为了防止表中的重复,我想创建一个NSDictionary使用文件完整路径作为另一个包含所有文件信息的NSDictionary的键,但我有点担心NSDictionary的最大密钥长度,以及是否这个解决方案是性能杀手与否...

4 个答案:

答案 0 :(得分:9)

对你使用的NSString的大小没有特别的限制,只要它没有那么大你填满所有的内存!字典不加载字符并开始查看它们本身,因此不存在任何与此相关的内部NSDictionary问题或性能问题,因为它所做的只是使用isEqual:方法,如果它返回true,则匹配。

希望有所帮助。

答案 1 :(得分:3)

没有特别限制。字典的一个先决条件是密钥必须符合NSCopying协议。将键值对插入字典时,字典会生成键对象的副本,以确保它在字典内不会发生变异。它使用密钥对象的哈希值来确定在内部对其进行排序的位置。如果对象在字典中发生变异,它会抛出排序并且字典不起作用,这就是字典复制的原因(尽管作为优化,当NSString等不可变对象是要求提供副本,它可以简单地增加保留计数并返回自身,但这是一个实现细节。

由于密钥必须符合NSCopying协议,这意味着您可以使用许多对象作为字典的键,包括NSArrayNSData等。不要担心在NSDictionary集合中使用大字符串的性能,除非您发现这确实是一个瓶颈。

答案 2 :(得分:2)

没有任何最大值,除了NSString的最大长度,我认为理论上是无限的/ UIntMax。 NSDictionary接口需要通过-hash和-isEqual:方法进行索引,这些方法由任何被用作键的对象实现,以允许键成为任何键,而不仅仅是NSStrings。 NSString当然实现了两个函数,但这不是重点 - 散列是一个int,所以基本上由NSString来找到一种方法将其内容转换为整数 - 它没有(并且实际上不能) )是唯一的,只是可重复的(每次都返回相同的结果)。有关散列的详细信息,请参阅here。基本上,这意味着每个NSString - 任何对象,实际上 - 都可以有一个哈希。因此,如果您可以将它存储在NSString中,那么将它放在NSDictionary中没有限制。此外,不要担心字典的性能/字典是完全有效的设计,并且速度足以适用。

答案 3 :(得分:1)

没有理论上的最大值。另外,在你确定它确实存在问题之前,我不会担心性能。