4

我注意到,对于一个对象来说,NSDictionary它必须符合NSCopying.

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

4

2 回答 2

6

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

于 2015-04-11T16:14:27.570 回答
6

NSDictionary保证如果您使用某个键存储一个值,则x该键是固定y的,您可以使用等效键( )检索该值y.isEqual(x) == YES。这样做只有两种可能性:

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

Apple 决定在大多数情况下,应对键更好。

如果您需要字典而不复制键(例如键不实现 NSCopying 或应对太昂贵),您可以使用NSMapTable。例如,您可以使用

[NSMapTable strongToStrongObjectsMapTable]

将键和值存储为强引用。

于 2015-04-11T17:21:36.157 回答