an0*_*an0 1 comparison nsdate ios
我将一个对象存储在一个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 [when class]
(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)[when hash]
(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美元)和isEqualToDate:(42美元)为他们返还NO?
解决了:
这个奇怪的不确定性原来是由sub-second differences.你必须在接受的答案下阅读我的第二条评论,因为它真的很有趣,如果你不知道它,有一天它可能会咬你.
isEqualToDate:还将查看毫秒数,这是您通过记录对象无法看到的,因为描述方法NSDate仅格式化人类友好的字符串,但日期对象后面有更多信息.
看起来你的两个日期略有不同,即使它们是在同一个运行循环中创建的,也可能发生这种情况,尝试创建一个并在2个引用中只使用一个对象,然后再进行第二次测试以检查NSDate单独创建的两个对象 - 甚至一个接一个,他们不应该是平等的.
引用Apple文档:
此方法检测日期之间的亚秒差异.如果要比较细粒度较小的日期,请使用timeIntervalSinceDate:来比较两个日期.