我有一些可以在 Intel Mac 上運行的 Objective-C 代碼,但在帶有 M1 芯片的 Mac 上卻失敗了。
dispatch_time_t now = dispatch_time(DISPATCH_TIME_NOW, 0);
dispatch_time_t delta = (uint64_t)(1 * NSEC_PER_SEC);
dispatch_time_t when = dispatch_time(now, delta);
NSLog(@"now: %llu", now);
NSLog(@"delta: %llu", delta);
NSLog(@"when: %llu", when);
NSLog(@"real delta: %llu", when-now);
它會列印出這樣的東西:
now: 1272914827933
delta: 1000000000
when: 1272938827933
real delta: 24000000
1272914827933 1000000000= 1273914827933,不是1272938827933。為什么這會失敗,而且只在某些 Mac 上?
編輯:在實際的 iPhone 設備上運行時,這也會被破壞。只需使用 Obj-C 創建一個新的 Xcode 專案,將代碼粘貼到 AppDelegate 中,然后在您的手機上運行。
uj5u.com熱心網友回復:
dispatch_time()第二個引數 (delta) 以納秒為單位,但是回傳的 dispatch_time_t 取決于 CPU 架構。對于 Intel,回傳值以納秒為單位。對于 Apple Silicon,該值以刻度為單位。
由于這兩個值的測量方式不同,因此您無法以這種方式計算數字。
這是一個新的測驗。注意 mac_absolute_time 現在總是在 dispatch_time 之前。
// cc -framework Foundation -o dispatch_time dispatch_time.m
#include <time.h>
#include <mach/mach_time.h>
#import <Foundation/Foundation.h>
int main() {
dispatch_time_t now = dispatch_time(DISPATCH_TIME_NOW, 0);
dispatch_time_t delta = (uint64_t) (1 * NSEC_PER_SEC);
dispatch_time_t when = dispatch_time(now, delta);
NSLog(@"mac_absolute_time: %llu", mach_absolute_time());
NSLog(@"now: %llu", now);
NSLog(@"delta: %llu", delta);
NSLog(@"when: %llu", when);
NSLog(@"invalid: when-now delta: %llu", when-now);
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/513041.html
標籤:目标-c
