我有一个带有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。

而且,您还应该重命名实例变量,该名称应反映它的含义。而且视图不是窗口控制器。

10-08 05:53