我有一个带有IBAction的按钮,该按钮显示另一个窗口:
-(IBAction)someButtonClick:(id)sender
{
anotherView = [[NSWindowController alloc] initWithWindowNibName:@"AnotherWindow"];
[anotherView showWindow:self];
}
我担心这里的内存管理。我在此IBAction中分配了一个对象,但未释放它。但是我该怎么办呢?如果我在显示后释放了该对象,则窗口将立即关闭。
最佳答案
由于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。
而且,您还应该重命名实例变量,该名称应反映它的含义。而且视图不是窗口控制器。