Вопрос управления памятью - PullRequest
       0

Вопрос управления памятью

0 голосов
/ 26 августа 2010

У меня есть кнопка с IBAction, которая показывает другое окно:

-(IBAction)someButtonClick:(id)sender
{
    anotherView = [[NSWindowController alloc] initWithWindowNibName:@"AnotherWindow"];
    [anotherView showWindow:self];

}

Я беспокоюсь об управлении памятью здесь. Я выделяю объект в этом IBAction и не освобождаю его. Но как я могу это сделать? Если я отпустил этот объект после показа, окно закроется немедленно.

Ответы [ 2 ]

2 голосов
/ 26 августа 2010

Представление хранится в переменной экземпляра, и у вас есть доступ к нему в любом месте вашего класса.Отпустите его в коде, который отклоняет представление.

1 голос
/ 26 августа 2010

Так как 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, вам не нужно писать сеттер.

А также вы должны переименовать вашу переменную экземпляра, имя должно отражать, что это такое. И представление не является оконным контроллером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...