如何在Objective-C中编写定时器?

new*_*mer 37 iphone timer objective-c nsdate nstimer

我正试图用NSTimer制作秒表.

我给出了以下代码:

 nst_Timer = [NSTimer scheduledTimerWithTimeInterval:0.001 target:self selector:@selector(showTime) userInfo:nil repeats:NO];
Run Code Online (Sandbox Code Playgroud)

并且它在几毫秒内无法工作.它需要超过1毫秒.

Bro*_*olf 88

不要那样用NSTimer.NSTimer通常用于在某个时间间隔触发选择器.它的精度不高,不适合你想做的事情.

你想要的是高分辨率计时器类(使用NSDate):

输出:

Total time was: 0.002027 milliseconds
Total time was: 0.000002 seconds
Total time was: 0.000000 minutes
Run Code Online (Sandbox Code Playgroud)

主要:

Timer *timer = [[Timer alloc] init];

[timer startTimer];
// Do some work
[timer stopTimer];

NSLog(@"Total time was: %lf milliseconds", [timer timeElapsedInMilliseconds]);  
NSLog(@"Total time was: %lf seconds", [timer timeElapsedInSeconds]);
NSLog(@"Total time was: %lf minutes", [timer timeElapsedInMinutes]);
Run Code Online (Sandbox Code Playgroud)

编辑:-timeElapsedInMilliseconds和添加方法-timeElapsedInMinutes

Timer.h:

#import <Foundation/Foundation.h>

@interface Timer : NSObject {
    NSDate *start;
    NSDate *end;
}

- (void) startTimer;
- (void) stopTimer;
- (double) timeElapsedInSeconds;
- (double) timeElapsedInMilliseconds;
- (double) timeElapsedInMinutes;

@end
Run Code Online (Sandbox Code Playgroud)

Timer.m

#import "Timer.h"

@implementation Timer

- (id) init {
    self = [super init];
    if (self != nil) {
        start = nil;
        end = nil;
    }
    return self;
}

- (void) startTimer {
    start = [NSDate date];
}

- (void) stopTimer {
    end = [NSDate date];
}

- (double) timeElapsedInSeconds {
    return [end timeIntervalSinceDate:start];
}

- (double) timeElapsedInMilliseconds {
    return [self timeElapsedInSeconds] * 1000.0f;
}

- (double) timeElapsedInMinutes {
    return [self timeElapsedInSeconds] / 60.0f;
}

@end
Run Code Online (Sandbox Code Playgroud)

  • 由于``[NSDate date]``在``startTimer``和``stopTimer``中自动释放,所以没有什么能保证自动释放池释放这些对象,然后再尝试使用它们,比如,``timeElapsedInSeconds` `.你应该在``startTimer``和``stopTimer``中保留它们,并在那里释放前面的实例(以及``dealloc``方法)以防止内存访问问题. (3认同)
  • @yourfriendzak:我指的是在`startTimer`和`stopTimer`中构造的`NSDate`对象; 它们是自动释放的,因此它们的保留计数为零,并且它们可以随时由自动释放池释放.我可能会把`start`和`end`变为`@property(nonatomic,retain)`然后使用`self.start = [NSDate date]`和`self.end = [NSDate date]`.在`dealloc`中,然后需要通过覆盖`dealloc`方法释放`start和`end`与`[start release]`和`[end release]`(但当然应该在`dealloc`中调用`dealloc`最后的超类). (3认同)
  • 如果我想使用这个类重复执行代码块(比如重复的NSTimer),我该怎么做? (2认同)
  • 这不是计时器! (2认同)