什么负责释放NSWindowController对象?

时间:2009-06-23 10:19:50

标签: objective-c cocoa appkit

让我说我显示一个这样的窗口:

  

[[TBAddTaskWindowController new] showWindow:self];

TBAddTaskWindowController对象意味着要发布在哪里?是在windowWillClose中调用[self release]的通用解决方案吗?

让任何其他对象“拥有”窗口感觉不对,因为它意味着存在直到用户关闭它。

2 个答案:

答案 0 :(得分:5)

是的,释放窗口控制器的常用方法是:

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

只要窗口在周围,窗口控制器就需要活动,所以当窗口消失时自动释放它是完全合理的。

请记住删除任何其他观察者等。

<小时/> [增加了在ARC下工作的信息]

对于ARC,您需要在窗口打开时保留对窗口控件的强引用,然后在窗口关闭时将其删除。
为此,我在窗口上添加了一个用两种方法控制的类别:

  • pnl_addWindowController - 首次打开窗口时由窗口控制器调用
  • pnl_removeWindowController - 来自windowWillClose

该类别维护一个全局NSMutableSet个活动窗口控制器。代码基本上只是[gWindowControllers addObject:self][gWindowControllers removeAllObjects],有一些懒惰的NSMutableSet创建和一些锁定。

答案 1 :(得分:2)

通过向类发送new消息来实例化窗口控制器的相同代码,就像它通过allocinit消息完成它一样。