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

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

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

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

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

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

1 Ответ

2 голосов
/ 04 марта 2010

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

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

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

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

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

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

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

Что касается того, насколько рекомендуется этот курс, У Apple есть это, чтобы сказать :

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...