먼저, 윈도우 (예를 NSWindow
또는 서브 클래스) 및 윈도우 컨트롤러 (NSWindowController
또는 서브 클래스의 인스턴스) 사이에 차이가있어 당신의 도움을 주셔서 감사합니다. 귀하의 질문과 코드는 두 용어를 서로 바꾸어 사용하는 것으로 보입니다.
창 컨트롤러를 사용하는 경우 창 자체를 해제하지 마십시오. 윈도우 콘트롤러는 그것을 소유하고, 콘트롤러가 끝나면 그것을 릴리즈 할 것입니다. 마찬가지로, releasedWhenClosed
은 창 제어기가 소유하는 창에 대해 무시됩니다. 이것은 getter -isReleasedWhenClosed
으로 문서화되어 있습니다.
코드는 myWindow
속성의 창 컨트롤러에 대한 강력한 참조를 유지합니다 (코드 조각은 창 컨트롤러와 비슷한 방식으로 categoriasView
속성을 참조 함). 이 속성을 지우면 창 컨트롤러가 해제됩니다. 이것이 가장 강력한 참조라면 윈도우 컨트롤러가 할당 해제되고 윈도우가 해제됩니다.
창에 대한 대리인을 할당 한 경우 창 대리자의 -windowWillClose:
메서드에서 속성을 지울 수 있습니다. 흔히 윈도우 컨트롤러는 윈도우의 델리게이트입니다. NIB에서 설정할 수 있습니다. 그러나이 경우 윈도우 컨트롤러가 소유자의 속성을 지우는 것은 그리 편리하지 않습니다.
또 다른 접근법은 창 컨트롤러의 소유자가 창에 의해 방출 된 NSWindowWillCloseNotification
을 관찰하도록하는 것입니다. 당신과 같이이를 설정할 수 있습니다
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(windowWillClose:) name:NSWindowWillCloseNotification object:self.myWindow.window];
그런 다음 윈도우의 대표가 아닌 다른 객체의 -windowWillClose:
방법을 구현할 수 있습니다. 이 방법을 사용하면 다음을 수행 할 수 있습니다.
- (void)windowWillClose:(NSNotification *)notification
{
NSWindow* window = notification.object;
if (window == self.myWindow.window)
self.myWindow = nil;
[[NSNotificationCenter defaultCenter] removeObserver:self name:NSWindowWillCloseNotification object:window];
}
고맙습니다 – user2924482