Я новичок в Mac Dev. Я пришел из iPhone dev. Мой вопрос касается немодального управления окнами. Это сильно отличается от iPhone и его модели управления памятью.Управление памятью немодальных окон
Скажет, например, у меня есть окно предпочтений, я могу использовать что-то вроде этого, чтобы показать окно:
-(IBAction)showPreferenceController:(id)sender {
if (!preferenceController) {
preferenceController = [[PreferenceController alloc]init];
}
[preferenceController showWindow:preferenceController];
}
Но с этим кодом, окно будет оставаться в памяти во время приложения жизни, потому что окно никогда не выпускался.
Чтобы избежать этого, я мог бы также использовать метод, описанный здесь:
stackoverflow.com/questions/1391260/who-owns-an-nswindowcontroller-in-standard-practice
Создание в PreferenceController
с + (id) sharedInstance
и отпустить окно с использованием (void)windowWillClose:(NSNotification *)notification
Я вижу множество примеров кода какао, где не модальные окна никогда не выпускаются. Например: http://www.mattballdesign.com/blog/2008/10/01/building-a-preferences-window/: Панель предпочтений и все подземелья создаются в awakeFromNib
и поэтому будут жить в памяти в течение всей жизни приложения.
Если взять, например, Xcode приложения, есть много покадровых окна:
- Глобальное окно Find (CMD + МАЙ + F)
- App Info Panel
- Окно справки
-. ..
Я полагаю, что эти окна выпускаются, когда они закрыты, чтобы сохранить память как можно ниже. Я бы хотел, чтобы некоторые советы знали, как лучше управлять немодальными окнами в приложении для какао. Хранить в памяти? Освобождение как можно скорее? Я знаю, что у Mac много памяти по сравнению с iPhone, но я также считаю, что не стоит хранить в объектах памяти, которые мы не используем.
Спасибо.
Отредактировано с Робом пост:
Я посылаю -autorelease к окну и установить мой указатель на ноль, так что я буду воссоздать окно позже. Это похоже на технику, которую вы цитируете, но независимо от того, следует ли использовать + sharedController для контроллера, не имеет отношения; вы можете это сделать, если у вас есть общий контроллер или нет.
Я не могу это сделать без синглета (+ sharedController).
я объясню, что я имею в виду с этим примером:
В App Controller:
@interface AppController : NSObject <NSApplicationDelegate> {
Реализация:
-(IBAction)showPreferenceController:(id)sender {
if (!preferenceController) {
preferenceController = [[PreferenceController alloc]init];
}
[preferenceController showWindow:preferenceController];
}
В контроллере предпочтений:
@interface PreferenceController : NSWindowController <NSWindowDelegate>
Реализация:
- (void)windowWillClose:(NSNotification *)notification {
[self autorelease];self=nil;
}
Он сработает, когда я закрою и снова откроюсь после окна: preferenceController освобожден, но не равен нулю. Поэтому, когда окно закрывается, мне нужно установить preferenceController на нуль. Нет проблем с этим синглом.
Без singleton я должен установить appController в качестве делегата окна предпочтений, чтобы иметь возможность устанавливать preferenceController на нуль, когда окно закрыто. Но мне это не нравится.
Отредактировано с Престоном комментарии
Я не говорил, но я хочу только один экземпляр моей покадрово окна, даже если мы называем -(IBAction)showPreferenceController:(id)sender
несколько раз.
Вот почему я тестирую, если preferenceController равен нулю или нет в appController.
Итак, мне нужно установить preferenceController на nil в appController, если мы закроем окно.
Таким образом, решение будет:
В AppController, слушая NSWindowWillCloseNotification:
- (void)windowWillClose:(NSNotification *)notification {
if ([notification object] == [preferenceController window]) {
[preferenceController autorelease];
preferenceController = nil;
}
}
Является ли это правильно? Это единственное решение? потому что это кажется немного сложным, просто для управления моим немодным окном ...
Вы не должны выпускать «я» здесь (вы почти никогда не должны называть [self release]). Вы должны освобождать self.window и устанавливать self.window = nil. –
Кроме того, я бы рекомендовал это быть «[self.window autorelease]; self.window = nil; ' Таким образом, окно может завершить закрытие до того, как оно будет выпущено. –
Спасибо, Роб, мой пример был только для того, чтобы объяснить проблему, потому что, как сказано, пример приведет к сбою. Я хочу установить preferenceController в nil, и это должно быть реализовано в appController. Я редактировал свой вопрос с вашими последними комментариями. – Benoit