【发布时间】:2013-02-06 20:18:25
【问题描述】:
我正在尝试实现一个类以用作 NSDictionary 中的键。文档说,为了用作键,对象需要实现 NSCopying 协议,我已经这样做了。
我看到一些非常奇怪的行为,其中值似乎神秘地变为 nil,即使我可以看到对象被正确存储在字典中。
据我所知,我已经正确实现了 copyWithZone: 和 isEqual:,但它仍然无法正常工作。
【问题讨论】:
我正在尝试实现一个类以用作 NSDictionary 中的键。文档说,为了用作键,对象需要实现 NSCopying 协议,我已经这样做了。
我看到一些非常奇怪的行为,其中值似乎神秘地变为 nil,即使我可以看到对象被正确存储在字典中。
据我所知,我已经正确实现了 copyWithZone: 和 isEqual:,但它仍然无法正常工作。
【问题讨论】:
文档没有明确说明的是,要将对象用作 NSDictionary 中的键,它必须同时覆盖 isEqual: 和 hash 方法,以及实现 NSCopying。
isEqual: 和 hash 的约定是,如果 isEqual: 为 2 个对象返回 YES,那么它们的 hash 方法必须返回相同的值。两个不相等的对象具有相同的散列是可以的,但如果它们相等,那么它们必须具有相同的散列。
当您尝试从字典读取和写入时,未能正确覆盖哈希将导致各种难以调试的问题。
【讨论】: