Objective c NSRunningApplication';终止';不可见

Objective c NSRunningApplication';终止';不可见,objective-c,cocoa,macos,Objective C,Cocoa,Macos,我正在构建一个启动另一个程序的程序,然后应该监视它,如果它终止,就采取行动。启动应用程序时,我可以从NSWorkspace获取NSRunningApplication的实例 现在,文档指出,NSRunningApplication具有可观察的键值的属性“terminated”。我已尝试实施: [browserInstance addObserver:self forKeyPath:@"terminated"

我正在构建一个启动另一个程序的程序,然后应该监视它,如果它终止,就采取行动。启动应用程序时,我可以从NSWorkspace获取NSRunningApplication的实例

现在,文档指出,NSRunningApplication具有可观察的键值的属性“terminated”。我已尝试实施:

[browserInstance addObserver:self 
                          forKeyPath:@"terminated"
                             options:NSKeyValueObservingOptionNew
                             context:NULL];
以及:


但我从未见过observeValueForKeyPath方法被绊倒。如果可能的话,有人知道如何做到这一点吗?我在网上的任何地方都找不到任何具体的例子。

问题:你已经验证了
browserInstance
不是
nil
,对吗?

我最后使用了:

NSNotificationCenter *center = [[NSWorkspace sharedWorkspace] notificationCenter];

    // Install the notifications.

    [center addObserver:self 
               selector:@selector(appLaunched:) 
                   name:NSWorkspaceDidLaunchApplicationNotification 
                 object:nil];
    [center addObserver:self 
               selector:@selector(appTerminated:) 
                   name:NSWorkspaceDidTerminateApplicationNotification 
                 object:nil];
然后实现appLaunchedappTerminated方法。

看看苹果的


介绍苹果公司推荐的观察您启动的进程和其他人启动的进程生命周期的方法。

您是否尝试过keyPath“isTerminated”

请注意,在的文档中,属性
terminated
指定getter
istereminated
,而不是默认的getter
terminated
。(这是有意义的,因为布尔属性“是”或“不是”)


这表明obj-c属性解析中可能存在错误,其中获取程序的名称用于KVO路径。

我已经对代码进行了几次检查,以确保所有内容都设置正确。我认为这不存在问题。您是否找到了解决方案?如果具有编辑权限的任何人看到此问题,他们是否可以将标题更改为更相关的内容,如“NSRunningApplication‘terminated’not observed”是的,但这并不能回答为什么KVO不在NSRunningApplication
terminated
上工作。我建议使用苹果在TN2050中提供的方法之一。记录在案的方法处理边缘情况,是苹果公司推荐的解决方案。请注意,TN2050是2008年9月10日最后修订的。除非TN2050被取代,否则它仍然是至少C开发的最佳实践。谢谢!您必须在
上遵守已取消的
。你,我的人,有鹰眼。精彩的接球。我用
finishedLaunching
键问了这个确切的问题。正是我需要的,ta!
NSNotificationCenter *center = [[NSWorkspace sharedWorkspace] notificationCenter];

    // Install the notifications.

    [center addObserver:self 
               selector:@selector(appLaunched:) 
                   name:NSWorkspaceDidLaunchApplicationNotification 
                 object:nil];
    [center addObserver:self 
               selector:@selector(appTerminated:) 
                   name:NSWorkspaceDidTerminateApplicationNotification 
                 object:nil];