我注意到一个由计时器执行的以下函数的显着内存使用:
_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、描述...)都会导致内存使用量以 ~1MB/秒的速度增加(考虑到指定的时间间隔)。最糟糕的是,它永远不会停止。虽然我还没有尝试将其设置到极限...
我尝试使用 Instruments(Leaks 模板)对其进行分析,但没有发现内存泄漏。
有什么线索吗?
编辑#1:
我做了一个简单的实验,用一个 swift 文件创建了一个控制台应用程序:
import Cocoa
while true {
guard let app = NSRunningApplication(processIdentifier: 315) else {
break
}
}
输入您正在运行的任何 pid。它需要几秒钟的演出......
编辑#2:
我的最新发现是进程类型直接影响行为。考虑:
TransformProcessType(&psn, UInt32(processType))
如果 processType = kProcessTransformToBackgroundApplication 或 kProcessTransformToUIElementApplication,我会遇到这个问题。如果进程类型 = kProcessTransformToForegroundApplication(默认值),则一切正常。