![](/img/trans.png)
[英]IOS/Objective-C/Xcode: implicit conversion loses integer precision error with int
[英]Uptime iOS Objective-C - millisecond precision
我正试图让iOS的正常运行时间。 我正在使用mach_absolute_time - 但我发现它在睡眠时暂停了。
我找到了这个片段:
- (time_t)uptime
{
struct timeval boottime;
int mib[2] = {CTL_KERN, KERN_BOOTTIME};
size_t size = sizeof(boottime);
time_t now;
time_t uptime = -1;
(void)time(&now);
if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1 && boottime.tv_sec != 0)
{
uptime = now - boottime.tv_sec;
}
return uptime;
}
它成功了。 但是,它整整回来了。 有什么方法可以获得毫秒数?
内核(显然)不会存储其启动时间的更高分辨率时间戳。
KERN_BOOTTIME
由bsd/kern/kern_sysctl.c
的sysctl_boottime
函数实现。 它调用boottime_sec
。
boottime_sec
在bsd/kern/kern_time.c
。 它调用clock_get_boottime_nanotime
,它有一个很有希望的名字。
clock_get_boottime_nanotime
在osfmk/kern/clock.c
。 硬编码总是在nanosecs
参数中返回0。
如果你想要纯粹的Objective-C,试试吧
NSTimeInterval uptime = [[NSProcessInfo processInfo] systemUptime];
( NSTimeInterval
是double
的typedef,表示秒。)
我知道这可能为时已晚,但你去了:
+ (NSTimeInterval)uptime {
struct timeval boottime;
int mib[2] = {CTL_KERN, KERN_BOOTTIME};
size_t size = sizeof(boottime);
struct timeval now;
struct timezone tz;
gettimeofday(&now, &tz);
double uptime = -1;
if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1 && boottime.tv_sec != 0) {
uptime = now.tv_sec - boottime.tv_sec;
uptime += (double)(now.tv_usec - boottime.tv_usec) / 1000000.0;
}
return uptime;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.