2009-06-23 41 views
2

可以說,我顯示像這樣的窗口:負責釋放NSWindowController對象的是什麼?

[[TBAddTaskWindowController新]的ShowWindow:自];

TBAddTaskWindowController對象在哪裏被釋放?是windowWillClose中調用[self release]的通用解決方案嗎?

讓任何其他對象「擁有」窗口感覺不對,因爲它意味着直到用戶關閉它。

回答

2

通過向該類發送new消息來實例化窗口控制器的相同代碼,就好像它已通過allocinit消息所做的那樣。

+0

因此,就我而言,應用程序委託人必須觀察窗口關閉,然後釋放窗口控制器? – 2009-06-23 10:27:59

+0

是的。我不確定你會在應用程序終止時看到關閉窗口的通知,但是 - 我正在撰寫一個與此有關的博客文章。 – 2009-06-23 16:02:51

5

是的,常見的方式做釋放窗口控制器是:

- (void)windowWillClose:(NSNotification *)notification 
{ 
    [self autorelease]; 
} 

窗口控制器需要,只要僅作爲窗口周圍住,所以自動釋放它時,窗口消失熟能生巧感。

記得去除其他觀察者等。


[添加信息ARC下工作]

對於ARC,你需要保留一個強大的參考窗口控制,同時在窗口打開,然後在窗口關閉刪除。
要做到這一點,我添加兩種方法控制的窗口上的類別:

  • pnl_addWindowController —通過當窗口被第一次打開
  • pnl_removeWindowController —窗口控制器從windowWillClose
稱爲所謂的

該類別維護活動窗口控制器的全局NSMutableSet。代碼實質上只是[gWindowControllers addObject:self][gWindowControllers removeAllObjects],有一些惰性創建的NSMutableSet和一些鎖定。