NSTimer不能在xCode中的CMD项目中工作

时间:2012-04-04 12:47:47

标签: objective-c timer nstimer

我在Objective-C中遇到NSTimer的问题。这是我的源代码: 的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;
}

TimerTest.h

#import <Foundation/Foundation.h>

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

TimerTest.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

我的程序应该记录&#34;勾选! \ n&#34;每0.5秒。但是我的程序完成了,xcode控制台很清楚,这意味着NSLog -(void)tick:(NSDate *)dt方法无效。我的错误在哪里?

2 个答案:

答案 0 :(得分:1)

  

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

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

答案 1 :(得分: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分配,否则你的代码会起作用。

其他一些事项:将其选择器传递给scheduledTimerWithTimerInterval:...的方法应为

形式
- (void)timerMethod:(NSTimer *)aTimer

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

[timer invalidate];

虽然您必须保留对计时器的引用才能执行此操作,但您似乎没有。