Ausgabe
Ich habe Objective-C-Code, der auf Intel-Macs funktioniert, aber auf Macs mit dem M1-Chip fehlschlägt.
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);
Es wird ungefähr so ausgedruckt:
now: 1272914827933
delta: 1000000000
when: 1272938827933
real delta: 24000000
1272914827933
+ 1000000000
= 1273914827933
, NICHT 1272938827933
. Warum zum Teufel schlägt das fehl und nur auf einigen Macs?
Bearbeiten: Dies ist auch defekt, wenn es auf einem tatsächlichen iPhone-Gerät ausgeführt wird. Erstellen Sie einfach ein neues Xcode-Projekt mit Obj-C, fügen Sie den Code in AppDelegate ein und führen Sie es auf Ihrem Telefon aus.
Lösung
Das zweite Argument von dispatch_time() (Delta) ist in Nanosekunden angegeben, die zurückgegebene dispatch_time_t hängt jedoch von der CPU-Architektur ab. Bei Intel wird der zurückgegebene Wert in Nanosekunden gemessen. Bei Apple Silicon wird der Wert in Ticks angegeben.
Da die beiden Werte nicht auf die gleiche Weise gemessen werden, können Sie auf diese Weise keine Zahlen berechnen.
Hier ist ein neuer Test. Beachten Sie, dass mac_absolute_time immer vor der Jetztzeit von dispatch_time liegt.
// 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;
}
Beantwortet von – James Risner
Antwort geprüft von – Cary Denson (FixError Admin)