我在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
方法无效。我的错误在哪里?
答案 0 :(得分:1)
不,不应该(至少不是根据你发布的代码)。你需要一个run loop。计时器仅作为运行循环上的事件触发。所以,在你的主要部分,你需要设置一个并运行它。我的程序应该每0.5秒记录一次“Tick!\ n”。
答案 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];
虽然您必须保留对计时器的引用才能执行此操作,但您似乎没有。