Как сохранить окно, не удерживая указатель на него в собранном мусоре Obj-C?

В настоящее время я работаю над знаменитым «Программированием какао для OSX» Аарона Хиллегааса.

В главе 12 он хочет, чтобы я создал окно информации, используя

[BOOL] successful = [NSBundle loadNibNamed:@"About" owner:self];

что само по себе отлично работает. Тем не менее, я использую сборщик мусора, и, поскольку я не сохраняю указатель на это окно, он собирает мусор и, таким образом, исчезает через секунду или две. Он отлично работает, если сборка мусора отключена.

Есть ли способ создать окно, не удерживая на нем указатель и не съедая его сборщиком мусора?


person bastibe    schedule 04.03.2010    source источник
comment
В главе 12 Аарон Хиллегаас также отмечает, что вы должны создать Outlet для окна About. Если вы сделаете это, вы сохраните указатель на окно, и он не будет собирать мусор. Я упустил это из виду.   -  person bastibe    schedule 05.03.2010


Ответы (1)


Вы можете сохраните окно с CFRetain или используйте NSGarbageCollector пользователя disableCollectorForPointer:. Однако вы можете легко ввести утечку памяти. Убедитесь, что любое действие, которое вы используете для закрытия окна, также освобождает окно.

Если sender передается в действие закрытия, наследуемое от NSView, оно будет иметь window, которое можно использовать для получения указателя на окно.

Однако это не то, как Cocoa предназначен для работы. В главе 12 книги Хиллегааса он говорит следующее:

При отправке showWindow: в первый раз NSWindowController автоматически загружает файл пера и перемещает окно на экран и на передний план. Файл пера загружается только один раз. Когда пользователь закрывает [окно], оно перемещается за пределы экрана, но не освобождается. В следующий раз, когда пользователь запрашивает [окно], оно просто перемещается на экран.

Если вы освободите окно «О программе», ваше приложение либо выйдет из строя, либо будет казаться, что оно не отвечает, когда кто-то откроет его во второй раз.

Редактировать: альтернатива (но та, которая не дает вам практики в загрузке наконечников) состоит в том, чтобы добавить окно «О программе» и NSWindowController к основному наконечнику (убедитесь, что вы сняли флажок «Видимый при запуске» в окне «О программе»). атрибут). Это делает беспорядок Main.nib, но может быть сделано полностью в Интерфейсном Разработчике. Соединять:

  • выход окна О контроллере в окно О программе
  • действие showWindow: контроллера About к пункту меню About
  • если у вас есть собственная кнопка закрытия в окне «О программе», подключите ее к действию performClose: окна.

Что касается целесообразности этого курса, Комментарий Apple:

Очень простое приложение может хранить все свои компоненты пользовательского интерфейса в одном файле пера, но для большинства приложений лучше распределить компоненты по нескольким файлам пера. Создание файлов пера меньшего размера позволяет загружать только те части вашего интерфейса, которые вам нужны немедленно. Меньшие файлы пера приводят к лучшей производительности для вашего приложения. Они также облегчают отладку любых проблем, с которыми вы можете столкнуться, так как меньше мест для поиска проблем.

person outis    schedule 04.03.2010
comment
Конечно, как вы собираетесь позже освободить окно, если вы не держите указатель на него, это интересный вопрос. (Не говорю, что вы ошибаетесь — я просто думаю, что первоначальный вопрос может идти по неверному пути.) - person Chuck; 04.03.2010
comment
как правильно тогда поступить? Подкласс NSWindowController для простого окна «О программе» без какой-либо интерактивности? - person bastibe; 04.03.2010
comment
@Paperflyer: просто следуйте главе 12. - person outis; 04.03.2010
comment
На самом деле, если предполагается, что это окно будет существовать на протяжении всей жизни приложения, нет никаких причин его выпускать. - person Chuck; 04.03.2010
comment
Спасибо, ребята, я что-то проглядел в книге (как обычно: PEBKAC). Но вы помогли мне найти мою ошибку и лучше понять вещи! - person bastibe; 05.03.2010