0

タイマーによって次の関数が実行されると、メモリが大量に使用されることに気付きました。

_timer = [NSTimer scheduledTimerWithTimeInterval:0.01
                                          target:self
                                        selector:@selector(test)
                                        userInfo:nil
                                         repeats:YES];

- (void)test {
    NSRunningApplication *app = [NSWorkspace sharedWorkspace].frontmostApplication;
    app.processIdentifier;
}

コードは基本的に何もしません。

NSRunningApplication インスタンスのほぼすべてのプロパティ (bundleIdentifier、bundleURL、description...) にアクセスすると、メモリ使用量が ~1MB/秒 (指定された時間間隔を考慮して) 増加します。そして最悪なのは、それが止まらないことです。まだ限界までやってないけど…

Instruments (Leaks テンプレート) を使用してプロファイリングを試みましたが、メモリ リークは見つかりませんでした。

どんな手掛かり?


編集#1:

私は簡単な実験を行い、単一の迅速なファイルでコンソール アプリケーションを作成しました。

import Cocoa

while true {
    guard let app = NSRunningApplication(processIdentifier: 315) else {
        break
    }
}

実行中の pid を入力します。数秒でギグがかかります...


編集#2:

私の最新の発見は、プロセスの種類が動作に直接影響するということです。検討:

TransformProcessType(&psn, UInt32(processType))

processType = kProcessTransformToBackgroundApplication または kProcessTransformToUIElementApplication の場合、問題に直面します。プロセス タイプ = kProcessTransformToForegroundApplication (デフォルト値) の場合、すべてが正常に機能します。

4

0 に答える 0