我编写了这个小程序,它应该打印两次当前最前面的应用程序,中间有 3 秒的中断。
void printFrontmostApp() {
NSRunningApplication *frontmostApplication = [NSWorkspace sharedWorkspace].frontmostApplication;
NSLog(@"%@",frontmostApplication);
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
printFrontmostApp();
sleep(3);
printFrontmostApp();
}
return 0;
}
当我运行这个程序时,我意识到 frontmostApplication 在第二次调用时没有刷新。我在这里找到了解决方案。但我还有两个问题:
1)我想知道为什么frontmostApplication没有更新。
2)每次调用时如何强制刷新?我不想在最前面的应用程序每次停用时都收到通知,因为它对我的目的来说效率有点低。
编辑: 为了清楚起见,我们假设现在的时间是 10:00:00。我调用 printFrontmostApp,它将“Xcode”打印到控制台,因为 Xcode 是当前最前面的应用程序。然后程序休眠 3 秒。在 10:00:01,我打开了另一个应用程序,比如 TextEdit。在 10:00:03,我的程序第二次调用 printFrontmostApp。我希望它打印“TextEdit”,这是当前最前面的应用程序。但它会打印“Xcode”。我无法理解这种行为。
有人可以解释一下 10:00:03 发生了什么吗?该函数似乎“记住”了 frontmostApplication 在 10:00:00 的值,并在第二次调用时保留它。我认为一旦超出范围,任何内存都会被释放,那么为什么会发生这种情况呢?
以及如何让我的程序在 10:00:03 获得最前面的应用程序?我可以在 10:00:00 获得最前面的应用程序,我应该能够在 3 秒后执行相同的操作,对吧?