iphone - iPhone 上的 mach_absolute_time 是基于什么

标签 iphone timer

我使用此代码来跟踪上次重新启动:

+ (float) secondsSinceLastReboot{
     return ((float)(mach_absolute_time())) * ((float)timebase.numer) / ((float)timebase.denom) / 1000000000.0f;
}

我假设 mach_absolute_time() 基于上次设备启动时间,就像在 Mac 上一样。看来不是基于此。我其实不知道它的依据是什么。

查看以下行为(今天的日期是2009-09-20):

lastRebootTime = [[NSDate date] addTimeInterval:-[self secondsSinceLastReboot]];
//last Reboot Time will contain : 2009-09-20 07:42:14 +0100

我绝对确定我当时没有重新启动我的设备。我的设备已经一周没有启动了。

此外,当我从电缆上拔下设备并运行此应用程序时,似乎当设备进入休眠状态时,lastRebootTime 开始在未来发生变化。看来 mach_absolute_time 没有考虑 sleep 时间。还是我错了?

我真的希望能够获得设备上次重新启动时的时间戳。有什么想法吗?

最佳答案

我自己也遇到了一些麻烦。没有很多好的文档,所以我进行了实验。这是我能够确定的:

mach_absolute_time 取决于设备的处理器。它返回自设备上次重新启动以来的时间间隔(也称为正常运行时间)。为了获得人类可读的形式,您必须根据 mach_timebase_info (比率)的结果对其进行修改,该结果将返回十亿分之一秒(或纳秒)。为了使其更有用,我使用了如下所示的函数:

#include <mach/mach_time.h>

int getUptimeInMilliseconds()
{
    const int64_t kOneMillion = 1000 * 1000;
    static mach_timebase_info_data_t s_timebase_info;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        (void) mach_timebase_info(&s_timebase_info);
    });

    // mach_absolute_time() returns billionth of seconds,
    // so divide by one million to get milliseconds
    return (int)((mach_absolute_time() * s_timebase_info.numer) / (kOneMillion * s_timebase_info.denom));
}

关于iphone - iPhone 上的 mach_absolute_time 是基于什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1450737/

相关文章:

java - 让scheduleAtFixedRate接受小时而不是毫秒?

iphone - Sencha Touch 2 中的 iPhone 上的 Google Chrome 无法使用停靠底部

vb.net - VB.net计时器滴答事件问题

swift - Swift 中高效且一致的时序 (GCD)

iphone - Phonegap数据库问题-在数据库中存储图像

java - 如何在重复结构中定时器结束后设置标签位置?

android - 如何在 Android 上暂停 handler.postDelayed() 计时器

javascript - 由于 JavaScript,iPhone 将逗号添加到输入数字字段

iphone - 通过 HTTP Live Streaming 进行精确清理

iphone - jquery 动画 --> css -webkit-transform : translate3d