Что отвечает за освобождение объектов NSWindowController?

StackOverflow https://stackoverflow.com/questions/1031715

  •  06-07-2019
  •  | 
  •  

Вопрос

Допустим, я отображаю окно следующим образом:

[[TBAddTaskWindowController новый] Показать окно:self];

Где находится объект TBAddTaskWindowController, предназначенный для освобождения?Является ли общим решением вызов [self release] в windowWillClose?

Кажется неправильным, чтобы какой-либо другой объект "владел" окном, потому что оно должно существовать до тех пор, пока пользователь не закроет его.

Это было полезно?

Решение

Тот же код, который инстанцировал оконный контроллер, посылая классу сообщение new , точно так же, как если бы это было сделано alloc и init сообщения.

Другие советы

Да, распространенный способ освободить оконный контроллер - это использовать:

- (void)windowWillClose:(NSNotification *)notification
{
    [self autorelease];
}

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

Не забудьте также удалить всех других наблюдателей и т.д.


[добавлена информация для работы в ARC]

Для ARC вам необходимо сохранить строгую ссылку на элемент управления window, пока окно открыто, а затем удалить ее, когда окно закроется.
Чтобы сделать это, я добавил категорию в окно, управляемое двумя методами:

  • pnl_addWindowController — вызывается оконным контроллером при первом открытии окна
  • pnl_removeWindowController — звонил из windowWillClose

Категория поддерживает глобальный NSMutableSet активных оконных контроллеров.Код, по сути, просто [gWindowControllers addObject:self] и [gWindowControllers removeAllObjects], с некоторым ленивым созданием NSMutableSet и некоторой блокировкой.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top