为什么NSDictionary的密钥必须符合NSCopying

cfi*_*her 2 cocoa objective-c nsdictionary nscopying

我注意到一个对象是一个NSDictionary必须符合的关键NSCopying.

为什么会这样?我会理解所有密钥都必须实现hash,但为什么NSCopying呢?

Avt*_*Avt 6

NSDictionary保证如果使用某个键存储值,则x此键已修复,您可以使用等效键y(y.isEqual(x) == YES)检索此值.这样做只有两种可能性:

  1. 复制键以防止它们更改.
  2. 要求密钥是不可变的.

Apple决定在大多数情况下应对密钥更好.

如果你需要一个字典没有复制密钥(例如密钥没有实现NSCopying或复制过于昂贵)你可以使用NSMapTable.例如,您可以使用

[NSMapTable strongToStrongObjectsMapTable]
Run Code Online (Sandbox Code Playgroud)

将键和值存储为强引用.


mat*_*att 5

因为密钥复制的.您不希望将密钥存储为对您开始使用的同一对象的引用,是吗?如果d[myThing] = myValue保留对可能可变实例的引用,那将是可怕的myThing.这意味着字典可能会在自己的背后变异.

  • 举一个极端的例子,想象一下两个键被变异以使它们的哈希值相同——从而违反了字典的整个结构。 (2认同)
  • 你自己声明的任何对象,比如我的例子中的`m​​yThing`.它是一个Thing,它是NSObject的子类.NSObject不符合NSCopying,因此也不符合 - 除非我这样做. (2认同)