2011-11-08 73 views
0

我想了解NSTimer,使用Foundation和打印到控制台。有人可以告诉我我需要做些什么才能使下面的工作?它编译没有错误,但没有激活我的startTimer方法 - 没有打印。如何获得NSTimer循环

我的目标是让一个方法调用另一个方法来运行某些语句,然后在设定的时间后停止。

#import <Foundation/Foundation.h> 

@interface MyTime : NSObject { 
    NSTimer *timer; 
} 
- (void)startTimer; 
@end 

@implementation MyTime 

- (void)dealloc { 
    [timer invalidate]; 
    [super dealloc]; 
} 

- (void)startTimer { 
    timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(runTimer:) userInfo:nil repeats:YES]; 
} 

- (void)runTimer:(NSTimer *)aTimer { 
    NSLog(@"timer fired"); 
} 
@end 


int main(int argc, char *argv[]) { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 


    MyTime *timerTest = [[MyTime alloc] init]; 
    [timerTest startTimer]; 

    [timerTest release]; 

    [pool release]; 
    return 0; 
} 
+0

请奖励过去曾帮助过您的人,并接受您的旧问题的答案。 – DarkDust

回答

-1

你必须初始化它后你的定时器添加到默认runloop:

[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode]; 

-(void)startTimer.

+0

我刚刚复制并粘贴到 - (void)startTimer但它仍然无法正常工作。如果放置在定时器语句之上,它不会像以前那样执如果放在下面,我得到一个线程!错误的错误。什么建议看起来不错 - 你可以再试一次吗?谢谢Tim。 – pete

+1

把它放在下面是正确的地方。问题在于,在你的程序中你启动了定时器,然后立即释放包含它的对象,并且它仍然在runloop中,所以当它被调用时,它所操作的对象(在这种情况下'testTimer')已经消失了,这就是为什么你会得到一个错误。 – Tim

+1

如果您不使用正在使用的scheduledTimer系列类,这只是正确的。 – logancautrell

6

计时器从来没有得到一个机会,在你的程序中火将这个,因为程序在创建定时器后立即结束。

有一个名为Run Loop的构造,它负责处理输入,包括来自定时器的输入。为每个线程创建一个运行循环,但在此情况下不会自动启动。

您需要运行运行循环并保持运行,直到计时器有机会触发。幸运的是,这很容易。插入:

[[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:5.0]]; 

发送startTimerreleasetimerTest之间。如果您想要重复计时器,则需要继续保持运行循环处于活动状态。

请注意,您只需要在一个简单的程序中这样做;当您使用GUI创建应用程序时,运行循环将通过Cocoa应用程序设置过程启动,并且在应用程序终止之前保持活动状态。

+0

我不认为说“当主函数结束时,运行循环也结束了”是不准确的。我的意思是,退出程序确实会终止runloop,但这不是问题。在这个特定的例子中,甚至没有runloop开始。 – Chuck

+0

@Chuck:我实际上正试图解决这个问题。我的印象是这个循环是由[NS?]线程自动启动的,但我想这实际上是由AppKit完成的? –

+0

每个NSThread *都有一个runloop,但它在告知之前不会运行。在一个普通的Cocoa应用程序中,主循环由'NSApplicationMain()'运行。我认为这就是它在文档中提到的那个功能“运行应用程序”时所指的。 – Chuck