NSTask的源代码中有趣的地方

时间:2015-09-03 07:48:57

标签: ios objective-c macos cocoa

在NSTask的源代码中,我在方法waitUntilExit中找到了有趣的地方:

- (void) waitUntilExit
{
    NSTimer *timer = nil;

    while ([self isRunning])
    {
        NSDate  *limit = [[NSDate alloc] initWithTimeIntervalSinceNow: 0.1];
        if (timer == nil)
        {
           timer = [NSTimer scheduledTimerWithTimeInterval: 0.1
                                                    target: nil
                                                  selector: @selector(class)
                                                  userInfo: nil
                                                   repeats: YES];
        }

        [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode
                                 beforeDate: limit];
        RELEASE(limit);
   }
   [timer invalidate];
}

我无法理解NSTimer的目的。那个方法类会被调用吗?

1 个答案:

答案 0 :(得分:1)

计时器目标是nil,因此选择器实际上是不相关的:您可以向nil发送任何消息,然后将其丢弃。

编译器仅验证选择器是否引用某种已知方法,在本例中为NSObject协议的class方法。

此虚拟计时器对于以下runMode语句是必需的 否则可以立即终止,如NSRunLoop documentation所述:

  

如果没有输入源或定时器附加到运行循环,则此方法立即退出并返回NO;除此以外。