我是一名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正确转换为相应的double值,但更大的数字(我测试了3和4)似乎被表示为0
?我正在使用配置为使用LLVM 3.0的Xcode 4.2进行编译。
编辑:
dispatch_time_t被定义为:
typedef uint64_t dispatch_time_t;
而 dispatch_time 是:
dispatch_time_t dispatch_time(dispatch_time_t when, int64_t delta);
而 NSEC_PER_SEC 是:
#define NSEC_PER_SEC 1000000000 /* nanoseconds per second */