Iphone NSTimer不';没有你的申请就不能工作?

Iphone NSTimer不';没有你的申请就不能工作?,iphone,objective-c,nstimer,uiapplication,cfrunloop,Iphone,Objective C,Nstimer,Uiapplication,Cfrunloop,我有一个定制的iPhone应用程序,它在任何方面都不依赖UIKit(它没有链接到UIKit)。这意味着我没有使用UIApplication,因此没有调用UIApplicationMain 问题是,当我创建一个计时器时,它从不触发。计时器的创建方式如下: [NSTimer timerWithTimeInterval:10 target:self selector:@selector(updateTime) userInfo:nil repeats:TRUE]; 我怀疑该问题可能与运行循环有关,因

我有一个定制的iPhone应用程序,它在任何方面都不依赖UIKit(它没有链接到UIKit)。这意味着我没有使用UIApplication,因此没有调用UIApplicationMain

问题是,当我创建一个计时器时,它从不触发。计时器的创建方式如下:

[NSTimer timerWithTimeInterval:10 target:self selector:@selector(updateTime) userInfo:nil repeats:TRUE];
我怀疑该问题可能与运行循环有关,因为在“main()”中完成基本初始化后,我执行以下操作:

NSLog(@"Starting application ...");
applicationInstance = [MyApp alloc];
[applicationInstance setMainLayer:mainLayer];
[NSThread detachNewThreadSelector:@selector(runApplication) toTarget:applicationInstance withObject:nil];

CFRunLoopRun();
我对UIKit进行了反向工程,并注意到UIApplication做了更多的事情,如注册系统事件等。NSTimer可能依赖于这些事情之一。我注意到的另一件事是,在UIApplication的委托中,线程与main()中的线程相同

如何使计时器正常工作?如果它与运行循环相关,有人能指出错误吗?“CFRunLoopRun()”用于挂起主线程,以便应用程序的其余部分可以运行。但我认为这是不对的


编辑:我认为需要配置运行循环。不知何故…

您的问题肯定与运行循环有关;具体见导言:

计时器与运行循环一起工作。为了有效地使用计时器,您应该了解运行循环是如何运行的,请参见和。请特别注意,运行循环保留其计时器,因此可以在将计时器添加到运行循环后释放计时器


解决办法很简单

NSTimer * timeUpdateTimer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(updateTime) userInfo:nil repeats:TRUE]; 
[[NSRunLoop mainRunLoop] addTimer:timeUpdateTimer forMode:NSDefaultRunLoopMode];

感谢您提供的提示Shaggy Frog

您是否查阅了线程编程指南?“使用运行循环”一节?我以前没有创建过自己的跑步循环,但在我看来这是一个很好的开始!是的。它没有提供任何信息:(“清单3-1创建一个运行循环观察器”正是您想要做的——创建一个运行循环并添加一个NSTimer——不是吗?