在看完《谁来释放NSWindowController对象?》后,我希望能进一步澄清一些问题。
我正在为我的侄子写一个简单的库存管理应用程序。我有一个表格视图显示他们的“图书馆”等内容。要向图书馆添加新项,他们可以点击一个“+”按钮。该按钮打开一个新窗口,提示他们输入项的详细信息,并在点击“确定”时验证输入。
所有这些都工作得很好。但是,我有一个关于内存管理的问题。为了创建新窗口,我使用以下代码:
- (IBAction)addNewItem:(id)sender {
LibraryItemEditorController *editorController =
[[LibraryItemEditorController alloc]
initWithWindowNibName:@"LibraryItemEditor"];
[editorController showWindow:nil];
// editorController is "leaked" here, it seems.
}
在addNewItem:
的结尾,我不能释放(也不能自动释放)editorController
,因为没有别的东西引用editorController
;如果我释放它,窗口就会立即消失。然而,一旦窗口关闭,我希望窗口控制器被释放。在苹果的窗口编程指南中,我读到以下内容:
如果您希望窗口关闭时使窗口和窗口控制器都消失,且该窗口不是文档的一部分,则您的
NSWindowController
子类可以观察NSWindowWillCloseNotification
或者作为窗口代理实现windowWillClose:
方法并包括以下代码行:我在窗口控制器的[self autorelease];
windowWillClose:
方法中使用了[self autorelease]
。虽然这样做是可行的,而且不会造成内存泄漏,但感觉很不好看;addNewItem:
方法看起来像在泄露内存,静态分析工具也这么认为。我知道实际上在windowDidClose:
已经处理过了,但感觉还是不对。此外,窗口控制器现在在没有保留自身的情况下释放自己。所有这些都违反了我所学习的内存管理规则。
我的另一个选择是在父控制器(可以是NSWindowController
或包含NSWindowController
的NSMutableSet
)上放置一个ivar,然后在父控制器中监听NSWindowWillCloseNotification
并作出响应来释放它。这样更加清晰,也是我将要采用的方式。但这需要做更多的工作,这就引出了我的问题。
监听NSWindowDidCloseNotification
是标准的做法吗?管理按需创建和销毁的NSWindowController
的标准方法是什么?[self autorelease]
的方式是传统推荐的选项吗?只有现在我们有了静态分析工具才会发现这是个问题吗?
_sharedInstance
将是一个静态变量,而不是实例变量。这通常是共享实例的实现方式。 - BJ Homer