(何时)CACurrentMediaTime/mach_system_time 在 iOS 上是不是环绕?
Posted
技术标签:
【中文标题】(何时)CACurrentMediaTime/mach_system_time 在 iOS 上是不是环绕?【英文标题】:(When) Does CACurrentMediaTime/mach_system_time wrap around on iOS?(何时)CACurrentMediaTime/mach_system_time 在 iOS 上是否环绕? 【发布时间】:2017-08-07 15:56:05 【问题描述】:要在 ios 上获得准确的时间测量值,应使用 mach_absolute_time()
。或CACurrentMediaTime()
,它基于mach_absolute_time()
。这在 this Apple Q&A 中有记录,并在多个 *** 答案中进行了解释(例如 https://***.com/a/17986909、https://***.com/a/30363702)。
mach_absolute_time()
返回的值什么时候回绕? CACurrentMediaTime()
返回的值什么时候回绕?这会在任何现实的时间跨度内发生吗? mach_absolute_time()
的返回值是 uint64
类型,但我不确定它如何映射到实际时间跨度。
【问题讨论】:
【参考方案1】:您引用的文档指出,mach_absolute_time
依赖于 CPU,因此我们不能说它必须经过多长时间才能结束。在模拟器上,mach_absolute_time
是纳秒,所以如果它在UInt64.max
处换行,则转换为 585 年。在我的 iPhone 7+ 上,每秒 24,000,000 mac_absolute_time
,相当于 24000 年。归根结底,mach_absolute_time
捕获的理论最大时间量会因 CPU 而异,但您在任何实际应用中都不会遇到这种情况。
对于它的价值,与您发现的各种帖子一致,CFAbsoluteTimeGetCurrent
documentation 警告说:
重复调用此函数并不能保证结果单调递增。由于与外部时间参考同步或由于用户明确更改时钟,系统时间可能会减少。
因此,如果您想要准确的经过时间,您绝对不想使用NSDate
/Date
或CFAbsoluteTimeGetCurrent
。两者都不能确保单调递增的值。
简而言之,当我需要这种行为时,我一般使用CACurrentMediaTime
,因为它享受mach_absolute_time
的好处,但它对我来说将其转换为秒,这使得它使用起来非常简单。它和mach_absolute_time
都不会在任何现实的时间段内循环。
【讨论】:
太好了,谢谢,这对我帮助很大!我对其他几台 iDevice(iPad Mini 1、iPad Air 2、iPad Pro 第一代、iPhone 6 使用了 24000 多年)和模拟器(近 585 年)都获得了一致的值。我使用了mach_timebase_info
函数,如前面提到的Apple Q&A 中所述。以上是关于(何时)CACurrentMediaTime/mach_system_time 在 iOS 上是不是环绕?的主要内容,如果未能解决你的问题,请参考以下文章