Что я называю «освобождением» вместо «закрытия» в NSWindow?

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

if (imageDroppedActionPopup) {
    [[self window] removeChildWindow:imageDroppedActionPopup];
    [imageDroppedActionPopup orderOut:nil];
    [imageDroppedActionPopup close];
    imageDroppedActionPopup = nil;
}

теперь думаю можно ли заменить

[imageDroppedActionPopup close];

с участием

[imageDroppedActionPopup release];

Вроде работает правильно. Но мне было интересно, правильно ли это.

Причина, по которой я это делаю, заключается в том, что если я по какой-то причине использую close, фокус приложения возвращается к главному окну документа, а не к текущему окну NSWindowController, которое является вышеупомянутым родителем всплывающего окна.


person aneuryzm    schedule 16.03.2012    source источник


Ответы (2)


Вам не нужно использовать close. Вызов orderOut: закроет окно. Вы должны сделать это перед удалением его как дочернего окна. Это предотвратит проблемы с порядком окон, которые вы видите.

Просто сделайте это:

if (imageDroppedActionPopup) 
{
    [imageDroppedActionPopup orderOut:nil];
    [[self window] removeChildWindow:imageDroppedActionPopup];
    [imageDroppedActionPopup release];
    imageDroppedActionPopup = nil;
}

Обратите внимание, что я все еще вызываю release в окне, прежде чем установить для него значение nil.

person Rob Keniger    schedule 16.03.2012

close убирает окно с экрана, release уменьшает счетчик сохранения объекта и может привести или не привести к его освобождению.

Кажется, это работает, потому что освобождение подразумевает удаление с экрана, но эти методы никогда не могут заменить друг друга. Даже если вы являетесь единственным владельцем, вы никогда не можете быть уверены, что release вызовет немедленное освобождение (и, следовательно, не немедленное исчезновение окна), потому что окно может быть временно сохранено кем-то другим.

Когда вам нужно закрыть окно, вызовите close. И вы должны вызывать release только для объектов, которые вы сохранили, выделили или скопировали, строго в соответствии с правилами управления памятью.

Учитывая, что замена close на release не привела к сбою, я думаю, вам нужны оба.

person hamstergene    schedule 16.03.2012
comment
В ПОРЯДКЕ. Возможно, вы знаете, почему закрытие всплывающего окна приводит к тому, что текущее окно перемещается за основное окно документа? Вы можете увидеть мой код в вопросе... - person aneuryzm; 16.03.2012