3

Je me demandais quelque chose sur le délégué de l'application de mon application. Pourquoi ne puis-je libérer comme ceci:fenêtre addSubview problème de publication

-(BOOL)application:(UIApplication *)application 
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    RootViewController *controller = [[RootViewController alloc] 
             initWithNibName:@"RootViewController" 
               bundle:[NSBundle mainBundle]]; 
    [self.window addSubview:controller.view]; 
    [controller release]; // Here's my question 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

j'étais presque sûr que -addSubview augmentation de la méthode par 1 mon nombre retenir. Alors pourquoi ai-je un crash quand je relâche mon contrôleur? Pourquoi travaille-t-il dans une autre classe que le délégué?

Merci!

Répondre

3

Les autres réponses sont correctes, le UIVIewController n'est pas conservé, ce que je recommande est de définir la propriété UIWindows rootViewController (uniquement iOS 4.0 et versions ultérieures) qui conserve le contrôleur. Si votre application prend en charge pré iOS 4.0, vous devrez stocker le contrôleur dans une variable d'instance.

-(BOOL)application:(UIApplication *)application 
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    RootViewController *controller = [[RootViewController alloc] 
             initWithNibName:@"RootViewController" 
               bundle:[NSBundle mainBundle]]; 
    //controller will be retained and view will set for you 
    window.rootViewController = controller; 
    [controller release]; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 
+0

Merci beaucoup. Donc, dans les autres cas, lorsque j'appelle push methode, mon contrôleur est conservé et je peux le relâcher après? – Pierre

+0

Oui, lorsque vous appuyez sur un contrôleur de vue à l'aide d'un contrôleur de navigation, il conserve le contrôleur de vue pour vous. – Joe

0

addSubView augmente le nombre de conserver la vue à l'intérieur du contrôleur de vue, c'est pourquoi les application se bloque si vous relâchez le contrôleur.

dans tous les cas, si vous ne le relâchez pas, vous aurez une fuite. la solution crée un ivar dans votre classe et lui assigne le contrôleur de vue (au lieu d'une variable locale), puis le libère en dealloc.

0

Lorsque vous ajoutez la vue en tant que sous-vue, affiche est conservée, pas son contrôleur. Donc, quand vous relâchez le contrôleur, il est désalloué et sa vue n'est pas. En conséquence, essayez d'envoyer des messages à son contrôleur déjà désalloué et à son application.

0

Ceci parce que vous êtes le propriétaire unique de ce contrôleur. Vous venez d'ajouter sa vue en tant que sous-vue de la fenêtre. Bien que la vue soit conservée par la vue de la fenêtre, le contrôleur ne le fait pas.

Alors, il se désalloué et toute utilisation de celui-ci fera de votre accident d'application.

1

Cette ligne

[self.window addSubview:controller.view]; 

augmente le nombre de conserver controller.viewpascontroller. C'est pourquoi

[controller release]; 

crée un problème.

S'il s'agit de la fenêtre principale, vous n'avez pas besoin de vous inquiéter de la fuite de mémoire, car le window est actif pendant toute la durée de vie du programme et toute la mémoire est purgée.