为什么NSOpenPanel / NSSavePanel显示内存泄漏?

时间:2011-08-08 18:57:24

标签: objective-c cocoa xcode4 nsopenpanel nssavepanel

不确定原因,但制作一个简单的[[NSOpenPanel openPanel] runModal];会造成内存泄漏 - 请参阅Leaks Instrument。

似乎关闭。

这是一个自动发布的对象,不应该在ARpool耗尽后自动释放吗?

有没有办法解决这个问题?

4 个答案:

答案 0 :(得分:6)

NSOpenPanel是一个单例,这意味着每次使用它时总是会得到相同的对象实例。这意味着您第一次调用[NSOpenPanel openPanel]时,会创建NSOpenPanel的实例,但不会发布。

这不是泄漏,而是优化。但是,有时Leaks仪器会选择这样一次只有泄漏的实例,因为实例(按设计)从未发布过。

NSOpenPanel是一个广泛使用且经过测试的类,其标准实现中的任何泄漏都不太可能存在。

答案 1 :(得分:2)

NSOpenPanel不是单身人士。它可能曾经有一段时间,但是查看最新的NSOpenPanel.h文件会明确表明它不是单例,或者至少Apple不希望您利用这个实现细节。

至于泄漏,我很困惑何时应该释放我的开放式面板并保留它。从文件系统编程指南的Using the Open and Save Panels部分,您在10.7及更高版本中的生活更加轻松:

Important: In OS X 10.6 and earlier, you must retain an open panel prior to displaying it and release it when you are done with it. Because the openPanel method returns an autoreleased object, the panel is normally released shortly after it appears on screen. Retaining the panel prevents it from being deallocated and dismissed prematurely. You do not need to retain the panel if it is attached to a window and you do not need to retain the panel in OS X 10.7 and when using ARC.

一旦我停止保留它,事情变得更容易,变得更容易:)

答案 2 :(得分:0)

仪器在检测泄漏方面并不完美 - 特别是对于自动释放的物体,并且具有误报的倾向。您可以尝试创建一个新的NSAutoreleasePool,然后在完成NSOpenPanel时将其耗尽以尽早强制释放 - 但我怀疑您实际上没有泄漏。如果您确信代码看起来很好并且是自动释放的,那么它可能很好。

答案 3 :(得分:0)

在使用10.12 SDK和Swift 3.0.1在OS X 10.11.6上构建的未装箱的应用程序中使用NSOpenPanel时,我看到Xcode的内存图工具中报告了“泄漏”。 PlugInKit类(PKHostPlugin,PKDiscoveryDriver等)中报告了“泄漏”,即使唯一的代码行是let openPanel = NSOpenPanel(),也会显示出来。

NSOpenPanel's documentation states

  

在沙盒环境中,打开的面板是单独绘制的   由powerbox处理,而不是由AppKit本身处理。当用户选择一个   要打开的文件,macOS会将该文件添加到应用程序的沙箱中。

在我对应用程序进行沙盒处理之后,由于NSOpenPanel实现代码不再在应用程序的地址空间中,因此“泄漏”没有显示在Xcode的内存图中,因此我不再需要担心它。