为什么 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
)。只有两种可能:
- 复制密钥以防止它们被更改。
- 要求键是不可变的。
Apple 认为在大多数情况下应对键更好。
如果你需要一个没有复制键的字典(例如键没有实现 NSCopying 或复制太昂贵)你可以使用 NSMapTable。
例如你可以使用
[NSMapTable strongToStrongObjectsMapTable]
将键和值存储为强引用。
我注意到一个对象要成为 NSDictionary
的键,它必须符合 NSCopying
。
为什么会这样?我会理解所有键都必须实现 hash
,但为什么 NSCopying
?
因为键被复制了。您不希望将密钥存储为对您开始使用的同一对象的引用,对吗?如果 d[myThing] = myValue
保留对 可能可变的 实例 myThing
的引用,那就太糟糕了。这意味着字典可能会在其背后发生变异。
NSDictionary
保证如果你用某个键 x
存储一个值,这个键是 fixed 并且你可以用等价的键检索这个值 y
(y.isEqual(x) == YES
)。只有两种可能:
- 复制密钥以防止它们被更改。
- 要求键是不可变的。
Apple 认为在大多数情况下应对键更好。
如果你需要一个没有复制键的字典(例如键没有实现 NSCopying 或复制太昂贵)你可以使用 NSMapTable。 例如你可以使用
[NSMapTable strongToStrongObjectsMapTable]
将键和值存储为强引用。