0

NSTimer我在 Objective-C 中有问题。这是我的源代码:Main.m

#import <Foundation/Foundation.h>
#import "TimerTest.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        TimerTest *timerTest = [[[TimerTest alloc] init] autorelease];
    }
    return 0;
}

定时器测试.h

#import <Foundation/Foundation.h>

@interface TimerTest : NSObject {
    NSTimer *_timer;
}
@property (nonatomic, retain) NSTimer *timer;
- (id) init;
@end

定时器测试.m

#import "TimerTest.h"

@implementation TimerTest
@synthesize timer = _timer;
- (id) init {
    if (self = [super init]) {
        [NSTimer timerWithTimeInterval:0.5f 
                                target:self 
                              selector:@selector(tick:) 
                              userInfo:nil 
                               repeats:YES];
    }
    return self;
}

- (void) tick: (NSDate *) dt {
    NSLog(@"Tick!  \n");
}

- (void) dealloc {
    self.timer = nil;    
    [super dealloc];
}
@end

我的程序应该每 0.5 秒记录一次“Tick!\n”。但是后来我的程序完成了,xcode 控制台清晰了,也就是说NSLogin -(void)tick:(NSDate *)dtmethod didn't work 。我的错误在哪里?

4

2 回答 2

1

我的程序应该每 0.5 秒记录一次“Tick!\n”。

不,不应该(至少根据您发布的代码不应该)。你需要一个运行循环。计时器仅作为运行循环上的事件触发。所以,在你的主要,你需要设置一个并运行它。

于 2012-04-04T12:58:46.690 回答
0

您不仅需要一个事件循环,而且您已经创建了一个计时器,而且您还没有在所述运行循环中安排它。代替:

    [NSTimer timerWithTimeInterval:0.5f 
                            target:self 
                          selector:@selector(tick:) 
                          userInfo:nil 
                           repeats:YES];

做这个:

    [NSTimer scheduledTimerWithTimeInterval:0.5f 
                                     target:self 
                                   selector:@selector(tick:) 
                                   userInfo:nil 
                                    repeats:YES];

我在 Cocoa 应用程序的上下文中设置了您的代码(因为它带有一个运行循环),在委托的 applicationDidFinishLaunching 中执行 TimerTest 分配,否则您的代码可以工作。

其他几件事:其选择器传递给 scheduleTimerWithTimerInterval:... 的方法应该是形式

- (void)timerMethod:(NSTimer *)aTimer

当您完成计时器时,只需使其无效:

[timer invalidate];

尽管您必须保留对计时器的引用才能执行此操作,但您似乎没有这样做。

于 2012-04-04T13:23:06.450 回答