NSDate
の1つのキーの下にオブジェクトを保存しました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
ご覧のとおり、値が($ 38)
で、ハッシュが($ 43)であるnewTaskDict
、オリジナルによってキー設定されたエントリが1つだけあります。NSDate
0x0f8b5ff0 2012-05-11 21:08:37 +0000
35846331
NSDate
エントリを取得するために使用したもう1つは($ 34):
0x0f8be100 2012-05-11 21:08:37 +0000
であり、そのハッシュは($ 44):です。
358463317
これらの2つNSDate
は、メモリアドレスを除いて、まったく同じではありませんか?isEqual:
($ 39)とisEqualToDate:
($ 42)はどうやって彼らにNOを返すことができますか?
解決済み:
この奇妙な不平等は、によって引き起こされたことが判明しましたsub-second differences
。受け入れられた答えの下にある私の2番目のコメントを読む必要があります。それは本当に興味深いものであり、知らない場合はいつかあなたを噛む可能性があるからです。