私は、iOSアプリケーション用の単体テストの1つが断続的に失敗していることに気付き、何が起きているのか調べました。 interval
は、メソッド呼び出しと[NSDate date]
の2回の呼び出しの間のヌルチェックがあるにもかかわらず、すべての今してゼロなってしまう、私のマシン上で[NSDate date]への隣接呼び出しは、必ずしも異なるタイムスタンプを生成するとは限りません。
NSDate *someDate = [NSDate date];
// Make a method call which accepts someDate as a param.
// Inside the method, check the param for null, and then:
NSDate *currentDate = [NSDate date];
NSTimeInterval interval = [currentDate timeIntervalSinceDate:someDate];
:影響を受けるコードパスがに簡素化することができます。私は1000回の反復でforループでテストを実行しました。そして、 'interval'がゼロである場合には約3回の反復しか必要としませんでした。私は日付が本当に同じであったことを確認するためにいくつかのブレークポイントを入れました。それは精度が失われたのはtimeIntervalSinceDate
のアーティファクトだけではありませんでした。
これは以前はthis questionで観察されていたようですが、答えは私にはほとんど見られないはずです。私はそれが私のコンピュータ、またはOSの変更、またはその両方/両方とも関係しているのだろうかと思います。
この解像度が何であるかを正確に調べようとしましたが、文書化されていないようです。私はときどき0.00003秒の間隔を見ることがあるので、少なくともマイクロ秒になり、日付を比較するためのNSCalendarの方法では、ナノ秒を区別することさえできるということです。私が気に入らないのは、私が予測できない "疑似ランダム"の結果です。 – RuslanD
'NSTimeInterval'は、既知の解像度を持つ' double'として定義されています。あなたは、IEEE浮動小数点型を掘り下げたり、解決策を得るために良いリファレンスを見つける必要があります。私が知っていることの一つは、値の間隔は単調ではなく、浮動小数点数の小数部分が表される方法です。 – Avi
逸話:何年も前、TIMESTAMPフィールドが完全に有効な主キーであると主張していたデータアーキテクト(DBスキーマデザイナー)と仕事をしました。彼女は間違っていましたが、単なる開発者は、ホーリー・データ・アーキテクトと矛盾する立場にありませんでした。企業の官僚制。/sigh – Avi