Значок строки меню NSStatusBar NSMenu с утечкой CFData - PullRequest
0 голосов
/ 07 ноября 2018

У меня странная утечка данных, и я надеюсь, что кто-то может объяснить, что здесь происходит не так. Минимальный рабочий пример проекта выглядит следующим образом:

  1. Создайте новый проект Mac OS Objective-C (Cocoa-App).
  2. Удалить все, кроме Info.plist и main.m
  3. В 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(_:)).

1 Ответ

0 голосов
/ 02 декабря 2018

Итак ... после довольно долгого пути это случилось снова.

Краткий ответ:

перезагрузите Mac.

Длинный ответ:

Как вы видите мой последний комментарий почти месяц назад. С тех пор я дважды перезагружал свой Mac и всегда проверял Xcode Profiler раньше. Для этих двух перезагрузок Профилировщик не показал утечек. Я не уверен, когда произошла последняя перезагрузка, примерно две недели назад. Сегодня я заметил, что Profiler снова показывает те же утечки.

Что не работает:

  • Очистка кешей и папки DerivedData.
  • Выйдите из Xcode и перезапустите его.
  • Выполнение обоих и любых других возможных комбинаций.

Кажется, это ошибка самого MacOS. Я бы создал отчет об ошибках, но, честно говоря, я даже не знал, что написать. Воспроизводимость просто случайно: - /
Также это не зависит от конкретного проекта. Использовал этот пример проекта в качестве справочного и сохранил его без каких-либо изменений в прошлом месяце.

...