2

假设我显示一个像这样的窗口:

[[TBAddTaskWindowController new] showWindow:self];

要释放的 TBAddTaskWindowController 对象在哪里?是在windowWillClose 中调用[self release] 的通用解决方案吗?

让任何其他对象“拥有”该窗口是不合适的,因为它意味着在用户关闭它之前一直存在。

4

2 回答 2

5

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

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

窗口控制器只需要在窗口存在时就存在,因此当窗口消失时自动释放它是非常有意义的。

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


[添加在 ARC 下工作的信息]

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

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

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

于 2009-06-23T14:34:48.280 回答
2

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

于 2009-06-23T10:22:26.713 回答