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
.
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? –
@Dan: Oui. (Si vous voulez une vue sans contrôleur, créez directement une UIView.) – kennytm