NSTask 源码中有趣的地方

Posted

技术标签:

【中文标题】NSTask 源码中有趣的地方【英文标题】:Interesting place in NSTask's source code 【发布时间】:2015-09-03 07:48:57 【问题描述】:

在 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 的用途。又会调用谁的方法类?

【问题讨论】:

您在哪里找到该代码?你能提供参考/链接吗? github.com/timburks/gnustep-base/blob/master/Source/NSTask.m 【参考方案1】:

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

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

下面的runMode 语句需要这个虚拟计时器 否则可能会立即终止,正如NSRunLoop documentation 所述:

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

【讨论】:

以上是关于NSTask 源码中有趣的地方的主要内容,如果未能解决你的问题,请参考以下文章

NSTask 启动路径错误 [重复]

NSBundle 中的 NSTask

将授权服务与 NSTask 一起使用

Cocoa NSTask 输出提取

Xcode 8 扩展执行 NSTask

NSTask 字符输出到 NSTextField 无缓冲作为连续流