Objective c 绝对零秒vs绝对零秒

Objective c 绝对零秒vs绝对零秒,objective-c,cocoa,Objective C,Cocoa,苹果有非常全面的文档,但我找不到任何关于函数AbsoluteToNonSeconds的文档?我要找出绝对时间和绝对时间的区别 注意 我开始认为苹果的文档只包含Objective-C函数?是这样吗 我通过使用Apple双击找到以下内容: 驱动程序的持续时间32位毫秒计时器 AbsoluteTime 64位时钟我不确定为什么没有在任何地方记录它,但如果有帮助的话,这是如何使用它的一个示例: static float HowLong( AbsoluteTime endTime, Abs

苹果有非常全面的文档,但我找不到任何关于函数AbsoluteToNonSeconds的文档?我要找出绝对时间和绝对时间的区别

注意

我开始认为苹果的文档只包含Objective-C函数?是这样吗

我通过使用Apple双击找到以下内容:

驱动程序的持续时间32位毫秒计时器
AbsoluteTime 64位时钟

我不确定为什么没有在任何地方记录它,但如果有帮助的话,这是如何使用它的一个示例:

static float HowLong(
    AbsoluteTime endTime,
    AbsoluteTime bgnTime
    )
{
    AbsoluteTime absTime;
    Nanoseconds  nanosec;

    absTime = SubAbsoluteFromAbsolute(endTime, bgnTime);
    nanosec = AbsoluteToNanoseconds(absTime);
    return (float) UnsignedWideToUInt64( nanosec ) / 1000.0;
}
更新:

“我对文档感兴趣的主要原因是想了解它与绝对化的区别”

那比较容易
AbsoluteToNanoseconds()
返回一个类型为
Nanoseconds
的值,该值实际上是一个
UnsignedWide
结构

struct UnsignedWide {
  UInt32              hi;
  UInt32              lo;
};
相反,
AbsoluteToDuration()
返回类型为
Duration
的值,该值实际上是
SInt32
带符号的long

typedef SInt32 Duration;
持续时间
使用较小的有符号类型,因为它们用于保存相对时间<另一方面,代码>纳秒只作为正值才有意义,而且它们可能非常大,因为计算机一次可以运行数年。

根据

SubAbsoluteFromAbsolute()
,以及其他所有的*Absolute*函数,都已从Mavericks中删除。我已经证实了这一点

这些函数不再是必需的,因为至少在Mavericks和Mountain Lion(我测试过的两个)中,
mach\u absolute\u time()
已经以纳秒为单位返回时间,而不是以绝对形式返回时间(过去是总线循环数),因此不再需要进行转换。因此,不再需要中显示的转换以及web上多个位置显示的类似代码。通过检查
mach\u timebase\u info()
返回的分子和分母是否为1,可以在您的系统上确认这一点

以下是我的测试代码,其中包含大量输出,以检查您是否需要在系统上执行转换(我必须执行检查,因为我的代码可能会在较旧的Mac上运行,尽管我在程序启动时执行检查,并设置函数指针以调用不同的例程):

#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
那么现在就开始吧;
uint64_t abs,纳米级;
马赫时基信息数据时基信息={0,0};
然后=马赫绝对时间();
睡眠(1);
现在=马赫绝对时间();
abs=现在-那时;
马赫时基信息(和时基信息);

谢谢。事实上,我对这些文档感兴趣的主要原因是想找出它与绝对相减的区别。有什么理由我必须使用次绝对相减而不是普通相减法吗?当然
如果时间过了,返回0而不是负数。我已经通过更新我的答案对您的第一条评论做出了回应。我希望这是有意义的。“我开始认为苹果文档只包含Objective-C功能?是这样吗?”没有。许多基于C的API都有文档记录。你应该提交一份bug报告,要求绝对无秒和朋友被记录:
mach\u timebase\u info()
在iOS上不返回
{1,1}
,所以我们仍然需要一些转换函数。
#include <CoreServices/CoreServices.h>
#include <mach/mach.h>
#include <mach/mach_time.h>
#include <time.h>
#include <iostream>

using namespace std;

int main()
{
   uint64_t now, then;
   uint64_t abs, nano;
   mach_timebase_info_data_t timebase_info = {0,0};

   then = mach_absolute_time();
   sleep(1);
   now = mach_absolute_time();
   abs = now - then;

   mach_timebase_info(&timebase_info);

   cout << "numerator " << timebase_info.numer << " denominator "
        << timebase_info.denom << endl;

   if ((timebase_info.numer != 1) || (timebase_info.denom != 1))
   {
      nano = (abs * timebase_info.numer) / timebase_info.denom;
      cout << "Have a real conversion value" << endl;
   }
   else
   {
      nano = abs;
      cout << "Both numerator and denominator are 1" << endl;
   }
   cout << "milliseconds = " << nano/1000000LL << endl;
}