2013-01-17 68 views
1

我有一個NSWindow/Controller,顯示模態。它有一個「關閉」按鈕迷上了一個動作是這樣的:NSApplication窗口屬性 - Windows未刪除?

- (IBAction)close:(id)sender 
{ 
    [self.window orderOut:sender]; 
    [self.window close]; 

    [[NSApplication sharedApplication] stopModal]; 
} 

從我的主窗口中,我顯示模式:

- (IBAction)modal:(id)sender 
{ 
    NSLog(@"Before: %lu", [[[NSApplication sharedApplication] windows] count]); 

    ModalWindowController *modal = [[ModalWindowController alloc] initWithWindowNibName:@"ModalWindowController"]; 
    [[NSApplication sharedApplication] runModalForWindow:modal.window]; 

    NSLog(@"After: %lu", [[[NSApplication sharedApplication] windows] count]); 
} 

我打開和關閉模式幾次,和輸出是這樣的:

2013-01-17 14:36:08.071 Modals[3666:303] Before: 1 
2013-01-17 14:36:08.962 Modals[3666:303] After: 2 
2013-01-17 14:36:09.578 Modals[3666:303] Before: 2 
2013-01-17 14:36:11.009 Modals[3666:303] After: 3 
2013-01-17 14:36:12.108 Modals[3666:303] Before: 3 
2013-01-17 14:36:12.910 Modals[3666:303] After: 4 

所以,[[[的NSApplication sharedApplication]窗口]計數]永遠只能增加

我希望它隨着我打開和關閉模式窗口而增加和減少。我的應用程序使用ARC。誰可以給我解釋一下這個?

預先感謝您

+0

什麼是'[window isReleasedWhenClosed]'return?模式顯示爲表單還是頂級模態彈出窗口? – abarnert

+0

關閉時窗口被設置爲釋放。事實證明,我沒有在這個項目上啓用ARC,因此控制器仍被保留。謝謝! – TheNextman

+1

好的,所以問題是你認爲你使用ARC,但不是?是的,這將導致各種泄漏... – abarnert

回答

1

你關閉你的窗口,但不是重新分配它,因爲你的窗口控制器ModalWindowController仍保留它。我沒有看到您的示例中有任何內容顯示窗口控制器正在發佈。

給你最簡單的答案就是讓你在撥打-runModalForWindow:後再發布你的窗口控制器。

您可能期望的是窗口控制器在窗口關閉時關閉。這是你必須讓自己發生的事情。從蘋果公司的文檔中的「窗口關閉行爲」:

如果你想有一個窗口的關閉,使這兩個窗口,窗口 控制器走開時,它不是一個文檔的一部分,你的 NSWindowController子類可以觀察NSWindowWillCloseNotification或者,如窗口委託,執行windowWillClose:方法並在您的執行中包含以下代碼行 :「[self autorelease];」

在您的情況下,這可能不是最好的方法,因爲在您有機會致電-stopModal之前,您會處理掉窗口控制器和窗口。

+0

這是正確的答案。將調用添加到[modal release]可以修復事情......事實證明,我沒有爲該項目啓用ARC。 D'哦!謝謝。 – TheNextman

+0

不客氣! – trudyscousin

1

給看看這個NSWindow方法:

- (void)setReleasedWhenClosed:(BOOL)releasedWhenClosed; 

如果你將它設置爲YES 關閉時你的窗口將被釋放。但要小心,當計數爲零時,它將被釋放。

+0

關閉時窗口被設置爲釋放。事實證明,我沒有在這個項目上啓用ARC,因此控制器仍被保留。謝謝! – TheNextman