2014-12-12 4 views
0

나는 새로운 NSWindow 표시 만드는거야 :에서라도 : 윈도우가 가까운 경우 NSWindowController를 해제

- (void)newWindow 
{ 
    if (!_myWindow) 
    { 
     self.myWindow = [[myWindowController alloc] initWithWindowNibName:@"myWindow"]; 

    } 

    [self.categoriasView showWindow:self]; 
} 

을하지만 창을 사용하여 NSWindowController에서 가까운 때 창 개체를 해제하려면 :

- (void)windowWillClose:(NSNotification *)notification 
{ 

} 

나는 [self.window setReleasedWhenClosed : YES]를 시도했다. 그러나 창문이 닫힌 후에도 여전히 그곳에있는 객체가 있습니다.

윈도우가 닫힌 후에 NSWindow 객체를 어떻게 풀 수 있는지 아는 사람이 있습니까?

은 정말

답변

3

먼저, 윈도우 (예를 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]; 
} 
+0

고맙습니다 – user2924482