5

我正在構建一個Cocoa應用程序,並且有關於使用窗口控制器的問題。這個想法是,如果用戶從菜單欄中選擇New,則會創建一個屬於NSWindowController子類的MyWindowController實例,並顯示一個MyWindow.xib的新窗口。當窗口關閉時釋放NSWindowController

我正在處理應用程序委託中的操作。從我看到的東西后,可以做下面的事情。一旦顯示窗口,我沒有任何理由再將指針存儲到窗口控制器,並且自從我分配窗口後,我也在顯示窗口之前自動釋放它。

[[[[MyWindowController alloc] init] autorelease] showWindow:self]; 

由於窗口很快被釋放,窗口會短暫地顯示在屏幕上,然後消失。我發現了一個解決方案,我將窗口控制器保留在-showWindow:方法中,讓它在獲取windowWillClose通知後自行釋放。

- (IBAction)showWindow:(id)sender 
{ 
    [self retain]; 
    [[NSNotificationCenter defaultCenter] addObserverForName:NSWindowWillCloseNotification 
                 object:self.window 
                 queue:nil 
                usingBlock:^(NSNotification *note) { 
                 [self release]; 
                }]; 
    [super showWindow:sender]; 
} 

有沒有更好的方法來做到這一點?我搜查了蘋果文檔,並沒有發現任何使用哪種做法。這聽起來像是它應該涵蓋的非常基本的東西,所以也許我只是在用錯誤的術語搜索。

回答

5

通常情況下,您會保留窗口控制器,只有在完成後才能釋放窗口控制器。我會說,你的應用程序代表將負責。如果可以有多個,只需將它們存儲在一個數組中。雖然你的解決方案可能會起作用,但它不是很優雅。

如果您正在使用基於文檔的Cocoa應用程序,則可以在您的文檔子類方法makeWindowControllers中創建窗口控制器,並讓該類持有指向窗口控制器的指針。