假设我显示一个像这样的窗口:
[[TBAddTaskWindowController new] showWindow:self];
要释放的 TBAddTaskWindowController 对象在哪里?是在windowWillClose 中调用[self release] 的通用解决方案吗?
让任何其他对象“拥有”该窗口是不合适的,因为它意味着在用户关闭它之前一直存在。
假设我显示一个像这样的窗口:
[[TBAddTaskWindowController new] showWindow:self];
要释放的 TBAddTaskWindowController 对象在哪里?是在windowWillClose 中调用[self release] 的通用解决方案吗?
让任何其他对象“拥有”该窗口是不合适的,因为它意味着在用户关闭它之前一直存在。
是的,释放窗口控制器的常用方法是:
- (void)windowWillClose:(NSNotification *)notification
{
[self autorelease];
}
窗口控制器只需要在窗口存在时就存在,因此当窗口消失时自动释放它是非常有意义的。
记得删除任何其他观察者等。
对于 ARC,您需要在窗口打开时保留对窗口控件的强引用,然后在窗口关闭时将其移除。
为此,我在使用两种方法控制的窗口上添加了一个类别:
pnl_addWindowController
— 首次打开窗口时由窗口控制器调用pnl_removeWindowController
— 调用自windowWillClose
该类别维护一个全局NSMutableSet
的活动窗口控制器。代码本质上只是[gWindowControllers addObject:self]
and [gWindowControllers removeAllObjects]
,有一些 NSMutableSet 的惰性创建和一些锁定。
通过向类发送消息来实例化窗口控制器的相同代码,new
就像它通过消息完成它一样。alloc
init