Question

Disons que je vais afficher une fenêtre comme celle-ci:

  

[[TBAddTaskWindowController new] showWindow: self];

Où l'objet TBAddTaskWindowController doit-il être libéré? La solution générique consiste-t-elle à appeler [libération automatique] dans windowWillClose?

Avoir un autre objet "propre" ne convient pas. la fenêtre, car elle est censée exister jusqu'à ce que l'utilisateur la ferme.

Était-ce utile?

La solution

Même code que celui qui instanciait le contrôleur de fenêtre en envoyant le message new à la classe, exactement comme s'il l'avait fait avec alloc et init messages.

Autres conseils

Oui, une méthode courante pour libérer le contrôleur de fenêtre consiste à:

- (void)windowWillClose:(NSNotification *)notification
{
    [self autorelease];
}

Le contrôleur de fenêtre n'a besoin de vivre que tant que la fenêtre est visible, il est donc parfaitement logique de le relâcher automatiquement lorsque la fenêtre s'en va.

N'oubliez pas de supprimer également tout autre observateur, etc.


[ajout d'informations pour travailler sous ARC]

Pour ARC, vous devez conserver une référence forte au contrôle de fenêtre lorsque la fenêtre est ouverte, puis la supprimer à la fermeture de la fenêtre.
Pour ce faire, j'ai ajouté une catégorie sur la fenêtre contrôlée avec deux méthodes:

  • pnl_addWindowController & # 8212; appelé par le contrôleur de fenêtre lors de la première ouverture de la fenêtre
  • pnl_removeWindowController & # 8212; appelé depuis windowWillClose

La catégorie gère un NSMutableSet global des contrôleurs de fenêtre actifs. Le code est essentiellement constitué de [gWindowControllers addObject: self] et de [gWindowControllers removeAllObjects] , avec une certaine création paresseuse du NSMutableSet et un certain verrouillage.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top