(C) 中的 `[[NSDate date] timeIntervalSince1970]` 自由函数总是 returns 相同的值

`[[NSDate date] timeIntervalSince1970]` in (C) free function always returns same value

如果我有:

double now_ms() {
    return 1000 * (float)[[NSDate date] timeIntervalSince1970];
};

:
    NSLog( @"%f", now_ms() ); // inside a CADisplayLink tick-event

每次都给出相同的值。

我可以通过创建 Lambda 来解决这个问题:

double (^now_ms)(void) = ^() {
    return 1000.f * [[NSDate date] timeIntervalSince1970];
};
NSLog( @"%f", now_ms() ); // works!

不过我更希望它是一个免费功能。

这是怎么回事?

我怀疑这是某种 运行 时间优化。

问题是 NSTimeInterval (which is what timeIntervalSince1970 returns) 是一个 double 而你要将它转换为 float。但是 float 只能捕获大约 7 位有效数字。这还不够准确,无法捕捉自 1970 年以来的秒数,更不用说毫秒数了。

您的 lambda 解决方案之所以有效,只是因为您删除了 float 转换。你可以对你的函数做同样的事情:

double now_ms() {
    return 1000.0 * [[NSDate date] timeIntervalSince1970];
}