为什么 NSDictionary 的键必须符合 NSCopying

Why must the key of an NSDictionary conform to NSCopying

我注意到一个对象要成为 NSDictionary 的键,它必须符合 NSCopying

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

因为键复制了。您不希望将密钥存储为对您开始使用的同一对象的引用,对吗?如果 d[myThing] = myValue 保留对 可能可变的 实例 myThing 的引用,那就太糟糕了。这意味着字典可能会在其背后发生变异。

NSDictionary 保证如果你用某个键 x 存储一个值,这个键是 fixed 并且你可以用等价的键检索这个值 y (y.isEqual(x) == YES)。只有两种可能:

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

Apple 认为在大多数情况下应对键更好。

如果你需要一个没有复制键的字典(例如键没有实现 NSCopying 或复制太昂贵)你可以使用 NSMapTable。 例如你可以使用

[NSMapTable strongToStrongObjectsMapTable]

将键和值存储为强引用。