Cocoa框架中是否存在内存泄漏?或者我错过了什么?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Cocoa框架中是否存在内存泄漏?或者我错过了什么?相关的知识,希望对你有一定的参考价值。
- 为了重现这个问题,只需创建一个Cocoa App,选择Swift或Objective-C(我已经测试过)运行项目。
- 打开
debug navigator
(您的应用程序的初始内存消耗应该在25MB左右),只需使用空应用程序的下拉菜单,并观察内存消耗在短时间内显着增长。 - 然后从Xaz中的
Open Developer Tool
打开Instruments
,在Choose a profiling template
中选择Leaks
并选择你的应用程序作为目标,然后单击记录按钮。 - 现在只需使用您的应用程序,调整窗口大小,打开下拉菜单。几分钟后,你会发现内存消耗量将超过110MB,你会发现泄漏点,如果你点击
- 应用程序的内存泄漏将继续增长,直到系统内存不足。
- 暂停然后点击检测到的泄漏点(时间线上的红色十字架),你可能会看到下面的一些罪魁祸首:
列表太长,所以我只包括一些,但所有这些都是来自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框架中是否存在内存泄漏?或者我错过了什么?的主要内容,如果未能解决你的问题,请参考以下文章