私はこの小さなプログラムを書きました。このプログラムは、現在の最前面のアプリケーションを 2 回印刷し、その間に 3 秒の休憩を挟みます。
void printFrontmostApp() {
NSRunningApplication *frontmostApplication = [NSWorkspace sharedWorkspace].frontmostApplication;
NSLog(@"%@",frontmostApplication);
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
printFrontmostApp();
sleep(3);
printFrontmostApp();
}
return 0;
}
このプログラムを実行すると、2 回目の呼び出し時に frontmostApplication が更新されないことに気付きました。ここで解決策を見つけました。しかし、まだ 2 つの質問があります。
1) frontmostApplication が更新されない理由を知りたい。
2) 呼び出すたびに強制的に更新するにはどうすればよいですか? 最前面のアプリケーションが非アクティブになるたびに通知を受け取りたくありません。私の目的には少し非効率的だからです。
編集: 明確にするために、現在の時刻が 10:00:00 であるとしましょう。printFrontmostApp を呼び出すと、コンソールに "Xcode" が出力されます。これは、Xcode が現在最前面にあるアプリであるためです。その後、プログラムは 3 秒間スリープします。10:00:01 に、TextEdit などの別のアプリを開きました。10:00:03 に、私のプログラムは printFrontmostApp を 2 回呼び出します。現在の最前線のアプリケーションである「TextEdit」を印刷することを期待しています。ただし、代わりに「Xcode」を出力します。この振る舞いが理解できません。
誰かが 10:00:03 に何が起こったのか説明してもらえますか? この関数は、10:00:00 の frontmostApplication の値を「記憶」しているようで、2 回目に呼び出されたときにそれを保持します。範囲外になるとメモリが解放されると思っていたのに、なぜこれが起こっているのですか?
また、プログラムで 10:00:03 に最前面のアプリを取得するにはどうすればよいでしょうか? 10:00:00 に最前面のアプリを取得できますが、3 秒後に同じことができるはずですよね?