代码之家  ›  专栏  ›  技术社区  ›  fresskoma

nsdictionary中的最大密钥长度是多少?

  •  4
  • fresskoma  · 技术社区  · 14 年前

    我目前正在开发一个应用程序,它在一个表中显示一堆文件,你可以添加和删除它们,以及其他任何东西。为了防止表中的重复,我想使用文件完整路径作为包含所有文件信息的另一个nsdictionary的键来创建nsdictionary,但我有点担心nsdictionary的最大键长度,以及此解决方案是否会成为性能杀手…

    4 回复  |  直到 11 年前
        1
  •  9
  •   DenverCoder9    14 年前

    对于您使用的nsstring的大小没有特定的限制,只要它不太大,就可以填满所有内存!字典不会加载字符并开始查看它们本身,因此不会出现与此相关的任何内部nsdictionary问题或性能问题,因为它只使用isequal:方法,如果返回true,则匹配。

    希望有帮助。

        2
  •  3
  •   dreamlax    14 年前

    没有具体的限制。字典的一个先决条件是密钥必须符合 NSCopying 协议。在字典中插入键值对时,字典将 复制 以确保它在字典中不会发生变化。它使用键对象的散列值来确定在内部对其进行排序的位置。如果对象在字典中时发生了变化,它将取消排序,字典将无法工作,因此字典会生成副本(尽管作为优化,但当不可变的对象如 NSString 如果需要一个副本,它可以简单地增加保留计数并返回自身,但这是一个实现细节)。

    因为键必须符合 窥镜 协议,它意味着您可以使用许多对象作为字典的键,包括 NSArray , NSData 等等。不要担心在 NSDictionary 集合,除非您发现这实际上是一个瓶颈。

        3
  •  2
  •   Jared Pochtar    14 年前

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

        4
  •  1
  •   Wevah    14 年前

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