Что я называю «релиз» вместо «закрыть» в NSWindow? - PullRequest
2 голосов
/ 16 марта 2012

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

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

Теперь мне интересно, смогу ли я заменить

[imageDroppedActionPopup close];

с

[imageDroppedActionPopup release];

Кажется, работает правильно. Но мне было интересно, если это правильно.

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

Ответы [ 2 ]

2 голосов
/ 16 марта 2012

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

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

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

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

0 голосов
/ 17 марта 2012

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

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

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

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

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