2010-05-20 4 views
1

Check it:Est-ce que [UIWindow addSubView:] ne conserve pas?

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSLog(@"Checking login--user value is %@", [defaults valueForKey:@"userID"]); 
if ([defaults valueForKey:@"userID"] == NULL){ 
    LoginViewController *loginController = [[LoginViewController alloc] initWithNibName:@"LoginView" bundle:nil]; 
    [window addSubview:loginController.view]; 
    [loginController release]; 
} 
else { 
    [window addSubview:[navigationController view]]; 
} 

Chaque autre endroit quand je mets un sous-vue dans une autre vue, je libérer ce point de vue après que je l'ai fait, parce qu'il est maintenant la propriété de la vue, il est une sous-vue. ICI, cependant, quand je fais [loginController release], chaque IBAction de ce loginController est appelée contre une instance désallouée. Commenter cette ligne fait tout fonctionner.

Je remarque la différence d'approche entre mon loginController et le navigationController fourni avec le template; La navigationController est une propriété synthétisée qui est publiée dans -(void)dealloc{ }, donc il est toujours là après avoir été mis en window.

Répondre

3

-addSubview: ne conserve que la vue, pas le contrôleur.

+0

Ah. Rétrospectivement, c'est assez évident. Je regardais une vue sans contrôleur, là. Donc, il n'y a rien que je doive faire à propos de la gestion de retenir compter sur la vue, alors, est là? Je suppose que quand il enlèveItselfFromSuperview, il retombera à 1 et ensuite quand le contrôleur sera libéré (je devrais en faire une propriété pour que je puisse le libérer au moment du dealloc, je suppose) ça disparaîtra complètement. Est-ce correct? –

+0

@Dan: Oui. (Si vous voulez une vue sans contrôleur, créez directement une UIView.) – kennytm

0

Vous ne devez pas ajouter manuellement la vue d'un contrôleur à une hiérarchie de vue car le contrôleur ne sera pas conservé et même s'il n'est pas retenu, les appels système attendus ne seront pas reçus (changements d'orientation, etc.).

Ajoutez à la place le contrôleur à un UIWindow en utilisant sa propriété rootViewController.

Si vous avez toujours le besoin d'ajouter la vue du contrôleur quelque part, vous ne devriez peut-être pas utiliser les contrôleurs de vue, mais simplement des vues personnalisées.

Questions connexes