提问人:Federico Terzi 提问时间:8/13/2023 更新时间:8/13/2023 访问量:58
Cocoa 的“addGlobalMonitorForEventsMatchingMask”的内存泄漏
Memory leak with Cocoa's `addGlobalMonitorForEventsMatchingMask`
问:
随着时间的推移,我面临着一个棘手的问题,即 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 工具的屏幕截图
答: 暂无答案
评论