Cocoa框架中是否存在内存泄漏?或者我错过了什么?

时间:2017-12-17 20:55:38

标签: xcode macos memory-leaks

  1. 要重现此问题,只需创建一个Cocoa应用程序,然后选择 Swift或Objective-C(我已测试过两者)运行项目。
  2. 打开debug navigator(您应用的初始内存消耗量 应该是大约25MB),只需玩你的空应用程序 下拉菜单,并观察内存消耗在短时间内显着增长。

  3. 然后从Xcode中的Open Developer Tool打开Instruments,在 Choose a profiling template选择Leaks并选择您的应用为 目标,然后单击记录按钮。

  4. 现在只需使用您的应用,调整窗口大小,打开下拉菜单 菜单。几分钟后你会注意到内存消耗 如果单击

  5. ,您将注意到泄漏点超过110MB
  6. 应用程序的内存泄漏将继续增长,直到系统内存不足为止。

  7. 暂停然后点击检测到的泄漏点(时间线上的红色十字架),你可能会看到下面的一些罪魁祸首:
  8. 列表太长,所以我只包括一些,但所有这些都是来自AppKit,无一例外:

    _NSLocalEventObserver   1   0x60000023ab00  32 Bytes    AppKit  +  [NSEvent addLocalMonitorForEventsMatchingMask:placement:handler:]
    _NSViewAuxiliary    1   0x110107080 448 Bytes   AppKit  -[NSView(NSInternal) _allocAuxiliary:]
    NSPopUpButtonCell   1   0x6080001c7530  240 Bytes   AppKit  -[NSControl initWithFrame:]
    NSControlAuxiliary  1   0x60800024c840  48 Bytes    AppKit  -[NSControl _commonEarlyInit]
    NSMutableDictionary 1   0x60800024c6c0  48 Bytes    AppKit  -[NSCell setFont:]
    NSPopUpButton   1   0x60800036e940  192 Bytes   AppKit  -[NSSpellChecker init]
    NSCellAuxiliary 1   0x6080000eb280  128 Bytes   AppKit  -[NSCell init]
    Malloc 48 Bytes 1   0x60800024c6f0  48 Bytes    AppKit  -[NSCell setFont:]
    NSMenu  1   0x608000861f40  64 Bytes    AppKit  -[NSPopUpButtonCell initTextCell:pullsDown:]
    _NSMenuImpl 1   0x6080000cdc10  112 Bytes   AppKit  -[NSMenu _createExtraIvars]
    NSCarbonMenuImpl    1   0x6080000cdc80  112 Bytes   AppKit  -[NSMenu _createMenuImpl]
    NSExtraMICData  1   0x608000038c00  32 Bytes    AppKit  -[NSMenuItemCell initTextCell:]
    NSMutableArray  1   0x60800024daa0  48 Bytes    AppKit  -[NSMenu insertItem:atIndex:]
    

    这是一个已知的错误吗?我还没有触及Xcode生成的代码。 AppKit或Cocoa框架中是否存在内存泄漏,或者两者都有?或者我做错了什么?

1 个答案:

答案 0 :(得分:1)

由于(4),内存大小会增加 - 菜单之类的对象在首次使用之前可能无法分配,等等 - 但这种增长不会无限制。

无法重现您的结果:在10.13.2& Xcode 9.2没有看到无限制的增长,也没有泄漏报告。

这并不是说你没有看到它,只是原因未知,但不太可能是框架本身的“泄漏”。尝试其他机器,检查您的设置等。