Почему NSOpenPanel / NSSavePanel показывает утечку памяти? - PullRequest
2 голосов
/ 08 августа 2011

Не знаю, почему, но простое [[NSOpenPanel openPanel] runModal]; создает утечку памяти - видно из Leaks Instrument.

Кажется выключенным.

Это автоматически высвобождаемый объект, не должен ли он автоматически высвобождаться после опустошения ARpool?

Есть ли способ исправить это?

Ответы [ 4 ]

6 голосов
/ 09 августа 2011

NSOpenPanel - одноэлементный, что означает, что вы всегда получаете один и тот же экземпляр объекта каждый раз, когда используете его. Это означает, что при первом вызове [NSOpenPanel openPanel] экземпляр NSOpenPanel создается и не освобождается.

Это не утечка, это оптимизация. Однако иногда инструмент Leaks обнаруживает такие единовременные экземпляры как утечки, потому что экземпляры (по замыслу) никогда не выпускаются.

NSOpenPanel - это такой широко используемый и проверенный класс, что каких-либо утечек в его стандартной реализации вряд ли будет.

2 голосов
/ 28 августа 2013

NSOpenPanel не является синглтоном.Возможно, это было когда-то, но если посмотреть на последний файл NSOpenPanel.h, то становится ясно, что он не одиночный или, по крайней мере, Apple не хочет, чтобы вы использовали преимущества этой детали реализации.

Какиз-за утечки я был смущен, когда я должен был отпустить мою открытую панель и удерживал ее.Из раздела Использование открытых и сохраненных панелей Руководства по программированию файловой системы ваша жизнь стала намного проще в 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.

После того, как я перестал ее сохранять, все стало проще истало намного проще:)

0 голосов
/ 31 января 2017

Я видел «утечки» в графическом инструменте Xcode при использовании NSOpenPanel в незаписанном приложении, построенном на OS X 10.11.6 с использованием 10.12 SDK и Swift 3.0.1.О «утечках» сообщалось в классах PlugInKit (PKHostPlugin, PKDiscoveryDriver и т. Д.), И они будут отображаться, даже если единственная строка кода будет let openPanel = NSOpenPanel().

Состояния документации NSOpenPanel

В изолированной среде открытые панели рисуются в отдельном процессе с помощью блока питания, а не с помощью самого AppKit.Когда пользователь выбирает файл для открытия, macOS добавляет этот файл в песочницу приложения.

После того, как я поместил приложение в песочницу, «утечки» не отображались на графике памяти Xcode как код реализации NSOpenPanelбольше не было в адресном пространстве приложения, поэтому мне больше не нужно было об этом беспокоиться.

0 голосов
/ 08 августа 2011

Приборы не идеальны для обнаружения утечек, особенно для объектов с автоматическим выпуском, и имеют склонность к ложным срабатываниям.Вы можете попытаться создать новый NSAutoreleasePool, а затем слить его по окончании работы с NSOpenPanel, чтобы принудительно освободить его досрочно, но я подозреваю, что у вас нет утечки.Если вы уверены, что код выглядит хорошо и он автоматически выпущен, то, вероятно, это нормально.

...