У меня странная утечка данных, и я надеюсь, что кто-то может объяснить, что здесь происходит не так. Минимальный рабочий пример проекта выглядит следующим образом:
- Создайте новый проект Mac OS Objective-C (Cocoa-App).
- Удалить все, кроме
Info.plist
и main.m
- В
Info.plist
сделать:
- Удалить запись
Main nib file base name
.
- Измените
Principal class
на "AppHook".
- Добавьте
LSUIElement
и установите для него YES
.
Далее измените main.m
на:
#import <Cocoa/Cocoa.h>
#import "AppHook.h"
int main(int argc, const char * argv[]) {
[[AppHook sharedApplication] run];
return 0;
}
И добавьте эти два новых файла: AppHook.h
#import <Cocoa/Coco a.h>
@interface AppHook : NSApplication <NSApplicationDelegate, NSMenuDelegate>
@property (strong) NSStatusItem *barItem;
@end
и AppHook.m
:
#import "AppHook.h"
@implementation AppHook
- (instancetype)init {
self = [super init];
self.delegate = self;
return self;
}
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
self.barItem = [NSStatusBar.systemStatusBar statusItemWithLength:NSVariableStatusItemLength];
self.barItem.highlightMode = YES;
self.barItem.title = @"yep";
self.barItem.menu = [[NSMenu alloc] initWithTitle:@"M"];
self.barItem.menu.delegate = self;
self.barItem.menu.autoenablesItems = NO;
}
- (NSInteger)numberOfItemsInMenu:(NSMenu*)menu {
return 1;
}
- (BOOL)menu:(NSMenu*)menu updateItem:(NSMenuItem*)item atIndex:(NSInteger)index shouldCancel:(BOOL)shouldCancel {
item.title = [NSString stringWithFormat:@"%@", [NSDate date]];
return YES;
}
@end
При запуске этого приложения с инструментами и шаблоном Leaks я получаю следующую утечку CFData:
0 Malloc +1 1 00:03.319.300 AppKit _DPSNextEvent
1 CFRetain +1 2 00:03.319.303 AppKit CopyCarbonUIElementAttributeValue
2 CFRelease -1 1 00:03.319.310 AppKit _DPSNextEvent
Это происходит каждый раз, когда меню состояния открывается и закрывается. Поэтому повторное нажатие на значок меню приведет к множеству утечек.
Ничего особенного, просто подкласс NSApplication
(мне нужно переопределить sendEvent(_:)
).