要在iOS上获得准确的时间测量值,应使用mach_absolute_time()
。或CACurrentMediaTime()
,基于mach_absolute_time()
。这在this Apple Q&A中有记录,并在几个StackOverflow答案中进行了解释(例如https://stackoverflow.com/a/17986909,https://stackoverflow.com/a/30363702)。
mach_absolute_time()
返回的值何时回绕? CACurrentMediaTime()
返回的值何时回绕?这是否发生在任何现实的时间跨度? mach_absolute_time()
的返回值属于uint64
类型,但我不确定这是如何映射到实际时间范围的。
答案 0 :(得分:1)
您引用的文档指出mach_absolute_time
与CPU有关,因此我们无法说明在它包装之前必须经过多长时间。在模拟器上,mach_absolute_time
是纳秒,所以如果它在UInt64.max
处包裹,则转换为585年。在我的iPhone 7+上,每秒24,000,000 mac_absolute_time
,相当于24,000年。最重要的是,mach_absolute_time
捕获的理论最大时间量因CPU而异,但在任何实际应用中都不会遇到这种情况。
对于它的价值,与您找到的各种帖子一致,CFAbsoluteTimeGetCurrent
documentation警告:
重复调用此函数并不能保证单调增加结果。由于与外部时间参考同步或由于时钟的明确用户更改,系统时间可能会减少。
因此,如果您想要准确的经过时间,那么您绝对不想使用NSDate
/ Date
或CFAbsoluteTimeGetCurrent
。既不能确保单调增加值。
简而言之,当我需要这种行为时,我通常使用CACurrentMediaTime
,因为它享受mach_absolute_time
的好处,但它将它转换为秒,这使得它非常简单使用。它和mach_absolute_time
都不会在任何现实的时间段内循环。