我将一个对象存储NSDate
在一个NSDictionary
. 然后我得到另一个NSDate
具有相同日期值的对象,并用它从NSDictionary
. 令我惊讶的是,它回来了nil
。但是在我的调试会话中揭示的内容更让我震惊:
(lldb) po when
(NSDate *) $34 = 0x0f8be100 2012-05-11 21:08:37 +0000
(lldb) po [newTaskDict objectForKey:when]
(id) $36 = 0x00000000
(lldb) po [newTaskDict allKeys]
(id ) $37 = 0x0f8c1650 <__NSArrayI 0xf8c1650>(
2012-05-11 21:08:37 +0000
)
(lldb) po [[newTaskDict allKeys] lastObject]
(id) $38 = 0x0f8b5ff0 2012-05-11 21:08:37 + 0000
(lldb) p (int)[[[newTaskDict allKeys] lastObject] isEqual:when]
(int) $39 = 0
(lldb) po [[[newTaskDict allKeys] lastObject] class]
(id) $40 = 0x3f4496b0 __NSDate
(lldb) po [当类]
(id) $41 = 0x3f4496b0 __NSDate
(lldb) p (int)[[[newTaskDict allKeys] lastObject] isEqualToDate:when]
(int) $42 = 0
(lldb) p (int)[[[newTaskDict allKeys] lastObject] hash]
(int) $43 = 358463317
(lldb ) p (int)[当散列时]
(int) $44 = 358463317
如您所见,newTaskDict
只有一个由原始值键入的条目,NSDate
其值为($38):
0x0f8b5ff0 2012-05-11 21:08:37 +0000
并且其哈希值为($43):
35846331
NSDate
我用来检索条目的另一个是($34):
0x0f8be100 2012-05-11 21:08:37 +0000
它的哈希是($44):
358463317
除了它们的内存地址之外,这两个不是NSDate
完全相同吗?isEqual:
($39) 和($42)怎么可能isEqualToDate:
为他们返回 NO?
已解决:
这种奇怪的不平衡原来是由sub-second differences
. 您必须在已接受的答案下阅读我的第二条评论,因为它真的很有趣,如果您不知道它可能有一天会咬到您。