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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Cocoa框架中是否存在内存泄漏?或者我错过了什么?相关的知识,希望对你有一定的参考价值。

  1. 为了重现这个问题,只需创建一个Cocoa App,选择Swift或Objective-C(我已经测试过)运行项目。
  2. 打开debug navigator(您的应用程序的初始内存消耗应该在25MB左右),只需使用空应用程序的下拉菜单,并观察内存消耗在短时间内显着增长。
  3. 然后从Xaz中的Open Developer Tool打开Instruments,在Choose a profiling template中选择Leaks并选择你的应用程序作为目标,然后单击记录按钮。
  4. 现在只需使用您的应用程序,调整窗口大小,打开下拉菜单。几分钟后,你会发现内存消耗量将超过110MB,你会发现泄漏点,如果你点击
  5. 应用程序的内存泄漏将继续增长,直到系统内存不足。
  6. 暂停然后点击检测到的泄漏点(时间线上的红色十字架),你可能会看到下面的一些罪魁祸首:

列表太长,所以我只包括一些,但所有这些都是来自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框架中是否存在内存泄漏,或者两者都有?或者我做错了什么?

答案

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

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

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

以上是关于Cocoa框架中是否存在内存泄漏?或者我错过了什么?的主要内容,如果未能解决你的问题,请参考以下文章

如何确定我的 android 应用程序是不是存在内存泄漏?

是否存在“好”内存泄漏之类的东西? [复制]

为啥.NET 没有内存泄漏?

什么调试器可以检查 C++ 代码是不是存在内存泄漏? [复制]

避免、发现和消除 Cocoa 中的内存泄漏

初步判断内存泄漏方法