让我说我显示一个这样的窗口:
[[TBAddTaskWindowController new] showWindow:self];
TBAddTaskWindowController对象意味着要发布在哪里?是在windowWillClose中调用[self release]的通用解决方案吗?
让任何其他对象“拥有”窗口感觉不对,因为它意味着存在直到用户关闭它。
答案 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
消息来实例化窗口控制器的相同代码,就像它通过alloc
和init
消息完成它一样。