Cocoa 的“addGlobalMonitorForEventsMatchingMask”的内存泄漏

Memory leak with Cocoa's `addGlobalMonitorForEventsMatchingMask`

提问人:Federico Terzi 提问时间:8/13/2023 更新时间:8/13/2023 访问量:58

问:

随着时间的推移,我面临着一个棘手的问题,即 Cocoa 的内存泄漏。特别是,使用以下示例中提供的标志,一些事件(例如。鼠标向下)会导致 NSEvent 对象无法释放,从而导致内存随时间推移无限增长。addGlobalMonitorForEventsMatchingMask

我没有使用 ARC(因为此示例是从 Objective C 不是主要语言的本机库中提取的,因此我需要能够保留对内存分配的控制)

AppDelegate.m(应用委托)

#import "AppDelegate.h"

const unsigned long long FLAGS = NSEventMaskKeyDown | NSEventMaskKeyUp | NSEventMaskFlagsChanged | NSEventMaskLeftMouseDown | 
                                 NSEventMaskLeftMouseUp | NSEventMaskRightMouseDown | NSEventMaskRightMouseUp | 
                                 NSEventMaskOtherMouseDown | NSEventMaskOtherMouseUp;

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
  [NSEvent addGlobalMonitorForEventsMatchingMask:FLAGS handler:^(NSEvent *event){
    //NSLog(@"event");
  }];
}

@end

AppDelegate.h

#import <AppKit/AppKit.h>
#import <Foundation/Foundation.h>

@interface AppDelegate : NSObject <NSApplicationDelegate, NSUserNotificationCenterDelegate> {
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification;

@end

main.m

#include "AppDelegate.h"
#import <AppKit/AppKit.h>
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
  @autoreleasepool {
    AppDelegate *delegate = [[AppDelegate alloc] init];

    NSApplication *application = [NSApplication sharedApplication];
    [application setDelegate:delegate];
    [application setActivationPolicy:NSApplicationActivationPolicyAccessory];
    [application run];
  }
  return 0;
}

该程序编译为:

gcc -framework Cocoa -framework IOKit -o testleak main.m AppDelegate.m

知道是什么原因造成的吗?或者我应该做些什么来防止它?

我尝试了 s 和其他方法的多种组合,但没有一个能解决问题。NSAutoreleasePool

到目前为止,我的发现:

  • 并非所有事件都会导致泄漏。例如,按键事件不会,而鼠标事件会

显示不断增加的 NSEvent 列表的 Zombie 工具的屏幕截图

enter image description here

Objective-C macOS

答: 暂无答案