Я разработчик Objective-C с небольшим опытом работы с C / C ++ (и нулевым обучением), и сегодня я столкнулся с чем-то странным с жестко закодированными числовыми значениями.
Я уверен, что это просто / глуповопрос, но может кто-нибудь объяснить, почему это работает:
NSDate *start = [NSDate date];
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^{
NSLog(@"seconds: %f", [start timeIntervalSinceNow]);
});
// output: seconds: -1.0001
И это также работает (примечание количество секунд изменилось):
NSDate *start = [NSDate date];
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 2 * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^{
NSLog(@"seconds: %f", [start timeIntervalSinceNow]);
});
// output: seconds: -2.0001
Но это выполняется немедленно:
NSDate *start = [NSDate date];
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 4 * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^{
NSLog(@"seconds: %f", [start timeIntervalSinceNow]);
});
// output: seconds: -0.0001
Тем не менее, использование 4.0
вместо 4
исправляет это:
NSDate *start = [NSDate date];
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 4.0 * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^{
NSLog(@"seconds: %f", [start timeIntervalSinceNow]);
});
// output: seconds: -4.0001
Почему 1 и 2 правильно приводятся к соответствующему двойному значению, но большим числам (я проверял 3и 4) представляется как 0
?
Я скомпилировал с Xcode 4.2, настроенным для использования LLVM 3.0.
РЕДАКТИРОВАТЬ:
dispatch_time_t определяется как:
typedef uint64_t dispatch_time_t;
И disp__time:
dispatch_time_t dispatch_time(dispatch_time_t when, int64_t delta);
И NSEC_PER_SEC:
#define NSEC_PER_SEC 1000000000 /* nanoseconds per second */