makeKeyAndOrderFront barfs при повторном использовании... (ARC?)
Вопрос...
Ранее я использовал этот код из моего MainMenu.xib для управления окнами:
-
if([olt_MainMenu_WINDOW isVisible]){
[olt_MainMenu_WINDOW setReleasedWhenClosed:NO];
[olt_MainMenu_WINDOW close];
}
...а потом
if(olt_DoSomething_WINDOW == nil)
if(![[NSBundle mainBundle] loadNibNamed:@"DoSomething" owner:self topLevelObjects:nil])
NSBeep();
if(olt_DoSomething_WINDOW != nil)
[olt_DoSomething_WINDOW makeKeyAndOrderFront:nil];
-
... затем вернитесь к моему окну в моем MainMenu.xib:
-
if([olt_DoSomething_WINDOW isVisible]){
[olt_DoSomething_WINDOW setReleasedWhenClosed:NO];
[olt_DoSomething_WINDOW close];
}
...а потом
if(olt_MainMenu_WINDOW == nil)
if(![[NSBundle mainBundle] loadNibNamed:@"MainMenu" owner:self topLevelObjects:nil])
NSBeep();
if(olt_MainMenu_WINDOW != nil)
[olt_MainMenu_WINDOW makeKeyAndOrderFront:nil];
-
но если я попытаюсь сделать KeyAndOrderFront из окна DoSomething во второй раз, то это вызовет исключение exc_bad_access (code=1 ...
Я могу сделать KeyAndOrderFront из MainMenu более одного раза, но не для других. Что мне не хватает?
Да, "Освободить при закрытии" не выбран в инспекторе Атрибутов для окна. Это первый раз, когда я использовал это с ARC, это может быть связано с этим?
1 ответ
На основании ссылки наloadNibNamed:owner:topLevelObjects:
Догадаюсь что у тебя слабый IBOutlet
к NSWindow
объект верхнего уровня в кончике doSomething. Так как вы не передаете что-то вроде &myArray
и вместо того, чтобы использовать topLevelObjects:nil
Совершенно очевидно, что "необходимо строго ссылаться на них, используя IBOutlets".
обсуждение
В отличие от устаревших методов, объекты [topLevelObjects-ed.] придерживаться стандартных правил управления памятью какао; необходимо сохранять строгую ссылку на них, используя IBOutlets или удерживая ссылку на массив, чтобы предотвратить освобождение содержимого пера.
Выходы к объектам верхнего уровня должны быть надежными ссылками для демонстрации владения и предотвращения освобождения.
Тебе нужно:
@property (strong) IBOutlet NSWindow *olt_DoSomething_WINDOW;
... или иным образом сохранять сильную ссылку на окно. IBOutlets
как правило, слабые, потому что они представляют собой элементы представления, сохраненные их суперпредставлением о том, что вам не нужно сохранять контроллер, но ваши NSWindow
здесь нет сохраняющего владельца, если вы явно не создаете его. Так что это был бы тот случай, когда вы действительно хотите сильный IBOutlet.