假设您将计时器附加到特定线程中的运行循环,但线程在计时器被触发之前已经退出,导致该方法不被执行。这种情况可能吗?
问问题
94 次
3 回答
3
当然这是可能的,而且很容易证明。
#import <Foundation/Foundation.h>
#define TIMER_INTERVAL 2.0
@interface Needle : NSObject
- (void)sew;
- (void)tick:(NSTimer *)tim;
@end
@implementation Needle
{
NSTimer * tim;
}
- (void)sew
{
@autoreleasepool{
tim = [NSTimer scheduledTimerWithTimeInterval:TIMER_INTERVAL
target:self
selector:@selector(tick:)
userInfo:nil
repeats:NO];
while( ![[NSThread currentThread] isCancelled] ){
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.5]];
}
}
}
- (void)tick:(NSTimer *)timer
{
NSLog(@"Let's get the bacon delivered!");
[[NSThread currentThread] cancel];
}
@end
int main(int argc, const char * argv[])
{
@autoreleasepool {
Needle * needle = [Needle new];
NSThread * thread = [[NSThread alloc] initWithTarget:needle
selector:@selector(sew)
object:nil];
[thread start];
// Change this to "+ 1" to see the timer fire.
NSTimeInterval interval = TIMER_INTERVAL - 1;
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:interval]];
[thread cancel];
}
return 0;
}
于 2013-07-26T20:25:36.567 回答
0
是的,除非您在主线程上,否则不会NSRunLoop
让线程保持活动状态并让计时器附加到。您需要创建一个并让它运行。
于 2013-07-26T19:17:04.147 回答
0
是的。如果有计时器但应用程序“过早”退出,这很容易发生。在这种情况下,计时器的触发日期将丢失 - 即使应用程序在之前设置的计时器触发日期之前重新启动也是如此。
于 2013-07-26T19:18:30.923 回答