Question

Je suis en train de mettre en œuvre ma propre version de NSViewController (pour la compatibilité ascendante), et je l'ai frappé un problème avec les fixations. Puisque les liaisons conservent leur cible, j'ai un retain cercle chaque fois que je lie par le propriétaire du fichier

Je pensais que je venais de supprimer explicitement mon point de vue de son superview et libérer les objets de haut niveau, et ce serait prendre soin des fixations, parce que mon contrôleur ne tient pas sur les vues plus, ils me libèrent et je peux aller. Mais pour une raison quelconque, mon contrôleur de vue ne toujours pas libéré. Voici un exemple d'application présentant le problème:

http://dl.dropbox.com/u/34351/BindingsLeak.zip

construire, lancer, et appuyez sur Cmd-K ( « Créer Nib » dans le menu « Edition ») pour charger une NIB dans la fenêtre vide. Frapper à nouveau Cmd-K pour libérer le premier contrôleur de vue (TestNibOwner) et charger une nouvelle. Le contrôleur vieux vue ne se dealloced, cependant.

Supprimer la « valeur » liant la case à cocher, et il est libéré très bien.

Si vous définissez des points d'arrêt à la sortie / conserver / overrides autorelease, vous voyez que _NSBindingInfo conserve le TestNibOwner, mais jamais le libère dans le cas des fuites.

Quelqu'un sait comment résoudre ce problème?

Était-ce utile?

La solution

Une chose que je l'ai fait pour le même problème est de créer un NSObjectController proxy dans ma plume. Ma classe NSViewController comme a un pointeur vers ce proxy et toutes les liaisons sont liées par elle. Quand je veux nettoyer le contrôleur de vue, je puis faire [selfProxy setContent: nil] sur le contrôleur de l'objet et le contrôleur de libérer la vue. Dans ce cas, le proxy NSObjectController agit comme l'auto-unbinder dans ce cas.

Il est plus manuel et vous ne pouvez pas simplement libérer la vue par lui-même, mais il ne résout le problème retenir.

Je vous suggère de faire ceci:

-(void) releaseTopLevelObjects
{
    // Unbind the object controller's content by setting it to nil.
    [selfProxy setContent:nil];

    NSLog( @"topLevelObjects = %@", topLevelObjects );
    [topLevelObjects release];
    topLevelObjects = nil;
}

Dans votre nib, les liaisons se passer par un chemin comme:

selfProxy.content.representedObject.fooValue

Autres conseils

Faire une petite enquête il semble que Apple a avec classe décharge et amis, une classe privée appelée NSAutounbinder qui prend soin de ce travail sale pour les classes telles que NSViewController et NSWindowController. Ne peut pas vraiment dire comment cela fonctionne ou comment reproduire cependant.

Alors, je ne peux pas vraiment répondre à votre question sur la façon d'éviter que le cycle de conserver de se produire pour les liaisons arbitraires dans une plume chargée, mais peut-être que c'est une consolation de savoir que Apple triche, et vous ne rien manquer évident . : -)

Lorsque vous supprimez votre point de vue de son superview, vous aussi l'envoyez un autre message -release? Il a été créé par désarchivage de la pointe, à droite?

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