NSStatusBar菜单栏图标NSMenu泄漏CFData

时间:2018-11-07 01:52:47

标签: objective-c macos memory-leaks nsmenu

我的数据泄漏很奇怪,希望有人可以解释这里出了什么问题。最小的工作示例项目如下:

  1. 创建一个新的Objective-C macOS项目(Cocoa-App)。
  2. 删除SaveChanges()[HttpPost] public ActionResult Save(Customer customer) { if (ModelState.IsValid) { if (customer.Id == 0) { _context.Customers.Add(customer); } else { var customerInDb = _context.Customers.Single(c => c.Id == customer.Id); customerInDb = customer; } _context.SaveChanges(); return RedirectToAction("Index", "Customers"); } else { // validation failed, show the form again with validation errors return View(customer); } } 以外的所有内容
  3. Info.plist中执行以下操作:
    • 删除条目main.m
    • Info.plist更改为“ AppHook”。
    • 添加Main nib file base name并将其设置为Principal class

接下来,将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

使用Instruments和Leaks模板运行此应用程序时,出现以下CFData泄漏:

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 的子类(我需要重写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 )。

1 个答案:

答案 0 :(得分:0)

所以...经过很长一段时间后,它又发生了。

简短答案:

重新启动Mac。

长答案:

您可以看到我的最新评论是近一个月前的事。从那时起,我两次重新启动了Mac,并始终检查Xcode Profiler。对于这两次重新启动,探查器没有显示任何泄漏。我不确定大约在两周前何时进行了最后一次重新启动。今天,我注意到Profiler再次显示了相同的泄漏。

无效的工作是什么

  • 清理缓存和DerivedData文件夹。
  • 退出Xcode并重新启动它。
  • 同时进行这些操作和其他任何可能的组合。

似乎是macOS本身的错误。我会创建一个错误报告,但老实说,我什至不知道该写些什么。可重复性只是偶然:-/
而且,它不依赖于特定项目。将此示例项目用作参考,并在上个月保持不变。