我有一个带有IBAction的按钮,它显示另一个窗口:
-(IBAction)someButtonClick:(id)sender
{
anotherView = [[NSWindowController alloc] initWithWindowNibName:@"AnotherWindow"];
[anotherView showWindow:self];
}
我担心这里的内存管理。我在这个IBAction中分配了一个对象,但是没有释放它。但是我该怎么做呢?如果我在显示后释放了这个对象,窗口将立即关闭。
答案 0 :(得分:2)
视图存储在一个实例变量中,您可以在类中的任何位置访问它。在解除视图的代码中释放它。
答案 1 :(得分:1)
由于anotherView是一个实例变量,你可以在你的dealloc方法中释放它。但是你仍然有内存泄漏,因为每次单击按钮时,都会创建一个新的窗口控制器实例,但只能释放最后一个实例。你真的应该使用访问器。这是我的建议:
- (NSWindowController *) anotherView;
{
if (nil == anotherView) {
anotherView = [[NSWindowController alloc] initWithWindowNibName:@"AnotherWindow"];
}
return anotherView;
}
- (void) setAnotherView: (NSWindowController *) newAnotherView;
{
if (newAnotherView != anotherView) {
[anotherView release];
anotherView = [newAnotherView retain];
}
}
- (void) dealloc;
{
[self setAnotherView: nil];
[super dealloc];
}
- (IBAction) someButtonClick: (id) sender;
{
[[self anotherView] showWindow: self];
}
如果使用Objective-C 2.0属性,则不必编写setter。
而且你应该重命名你的实例变量,名称应该反映它是什么。并且视图不是窗口控制器。