2010-08-26 3 views
0

J'ai un bouton avec IBAction, qui montre une autre fenêtre:mémoire managment question

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

} 

Je soucier de la gestion de la mémoire ici. J'attribue un objet dans cette IBAction et ne le libère pas. Mais comment puis-je le faire? Si je libère cet objet après l'affichage, la fenêtre se fermera immédiatement.

Répondre

1

Comme anotherView est une variable d'instance, vous pouvez la libérer dans votre méthode dealloc. Mais alors vous avez toujours une fuite de mémoire, puisque chaque fois que vous cliquez sur votre bouton, une nouvelle instance du contrôleur de fenêtre est créée, mais seule la dernière peut être libérée. Vous devriez vraiment utiliser des accesseurs pour cela. Voici ma suggestion:

- (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]; 
} 

Si vous utilisez une propriété Objective-C 2.0, vous ne devez pas écrire le compositeur.

Et vous devez également renommer votre variable d'instance, le nom doit refléter ce que c'est. Et une vue n'est pas un contrôleur de fenêtre.

+1

Mieux encore, ne créez que le contrôleur de fenêtre lorsqu'il n'a pas été créé auparavant. Si c'est le cas, envoyez simplement celui que vous avez déjà le message 'showWindow:'. –

+0

C'est exactement ce que fait mon code. Le getter '-anotherView' crée le contrôleur de fenêtre s'il n'y en a pas encore. S'il y en a déjà un, il est simplement renvoyé. Donc '-someButtonClick:' obtient toujours le même objet. – Sven

2

La vue est stockée dans une variable d'instance et vous pouvez y accéder n'importe où dans votre classe. Relâchez-le dans le code qui rejette la vue.