2010-10-19 7 views
0

voici un problème avec le problème de gestion de la mémoire.problème à propos de subview conserver superview dans objectif-C

Dire que j'ai vue A, il a un pointeur qui pointe vers son sous-vue B. Je l'utilise @property(nonatomic, retain) se réfèrent à la vue B.

maintenant dans B sous-vue, je besoin d'un pointeur pour pointer vers son superview R. Donc, j'utilise un autre @property(nonatomic, retain) se référer à sa superview A.

Voici ma préoccupation, j'ai lu un article Hold Me, Use Me, Free Me sur conserver et de libérer des choses dans l'objectif c. Il a mentionné "conserver les cycles". Donc, il est dit qu'une sous-vue n'a pas besoin de conserver sa vue d'ensemble, en fait elle serait redondante si elle le fait. Est-ce que cela signifie dans mon exemple, la sous-vue B seulement besoin d'utiliser @property(nonatomic) se référer à sa superview A? THX!

BTW, si je n'ai pas écrit retient dans la @ propriété pour la vue A, ai-je besoin de [viewA release] dans la méthode dealloc?

Répondre

3

Chaque sous-vue possède déjà un pointeur vers sa vue d'ensemble. Il est géré par la classe NSView. Voir -[NSView superview]. Donc, vous pouvez simplement utiliser [self superview] ou self.superview et ignorer la gestion de la mémoire entièrement.

Si vous souhaitez continuer comme vous êtes pour une raison quelconque, vous devez spécifier que la propriété superview est une propriété assign pour éviter un avertissement. Vous ne le diffuserez pas non plus dans -dealloc car vous ne l'avez jamais conservé.

Plus simplement: les sous-vues ne possèdent pas leurs vues d'ensemble.

Si vous codez pour iOS, remplacez simplement NSView par UIView et relisez.

+0

Alors, que se passe-t-il si View A est une classe UIViewController (sous-classe de UIResponder-> NSObject)? J'ai essayé d'ajouter une sous-vue, qui est une UIImageView (sous-classe de UIView). Donc quand j'utilise self.superview dans la classe subview, il ne m'a pas donné la classe UIViewController (que je veux), mais me donne le UIViewController.view. Alors, comment pourrais-je faire pour obtenir la classe UIViewController. (En fait c'est la classe UIViewController.view addSubview de la classe UIImageView, pas la classe UIViewController elle-même Donc, dans la classe subView, self.superView ne pointe pas vers la classe UIViewController) – sbs

+0

Il est payant d'être précis: un contrôleur de vue n'est pas lui-même une vue, mais régit plutôt une vue. Une vue est ignorante de son contrôleur par conception. Sa communication avec son contrôleur est médiatisée par la chaîne du répondeur: l'interaction de l'utilisateur fait monter la chaîne du répondeur jusqu'à ce qu'elle rencontre un gestionnaire. Vous pouvez parcourir cette chaîne en utilisant '- [UIResponder nextResponder]'. Étant donné qu'un contrôleur de vue possède sa vue contrôlée, vous devez toujours éviter de provoquer un cycle de conservation - vous ne souhaitez toujours pas que la sous-vue conserve le contrôleur de sa vue d'ensemble. –

0

maintenant dans B sous-vue, je besoin d'un pointeur vers le point à son superview A.

Vous avez déjà un. Utilisez [self superview].

0

Votre UIView ne devrait pas avoir besoin du contrôleur UIViewController. Qu'essayez-vous de faire? Si ce n'est pas déjà fait, lisez les documents Apple sur le modèle Model-View-Controller.

+0

Ma vue est en fait la vue de ViewController, elle est créée automatiquement lorsque je crée le projet View-Based. – sbs

Questions connexes