1

Je m'interroge sur les 2 approches suivantes.Ajouter un UIViewController à une pile UINavigationController - l'approche correcte

Première:

SomeViewController *someViewController = [[SomeViewController alloc] init]; 
    [self.navigationController pushViewController:someViewController animated:YES]; 
    [someViewController release]; 

Deuxième:

SomeViewController *someViewController = [[SomeViewController alloc] init]; 
self.iVarViewController = someViewController; 
[someViewController release]; 
[self.navigationController pushViewController:self.iVarVierController animated:YES]; 

Est-il acceptable de prendre la première approche, ou doit-on toujours essayer d'adopter la deuxième? Qu'est-ce qui ne va pas avec la première approche? Quand 'someViewController' est poussé sur la pile, son nombre de retain est-il incrémenté et donc il n'est jamais complètement libéré? C'est pourquoi vous pourriez vouloir l'assigner à une propriété comme dans la deuxième approche? Mais dans la deuxième approche, vous ne pouvez pas être certain quand il sera publié.

J'ai lu un similar post mais je suis encore un peu incertain alors j'ai pensé que je demanderais encore plus simplement.

Répondre

0

Les conséquences des deux approches sont légèrement différentes. Dans la première, l'instance de SomeViewController et sa vue seront désaffectées dès que l'instance est éclatée. Dans la seconde, l'instance de SomeViewController sera conservée en mémoire jusqu'à ce qu'elle soit remplacée par une nouvelle (self.iVarViewController = someViewController).

La deuxième approche pourrait avoir un sens si le premier contrôleur de vue doit envoyer des messages à la seconde (par exemple pour obtenir des valeurs de propriété modifiées) après que le second contrôleur a été déclenché. Dans ce cas, vous devrez vous demander s'il est judicieux de recréer l'objet à chaque fois, plutôt que de simplement réutiliser l'instance stockée dans la propriété (ivarViewController dans votre exemple). La meilleure solution dépend de la combinaison des modes d'utilisation attendus pour cette partie de votre application et des caractéristiques de performance du second contrôleur et de sa vue. (Par exemple, combien de mémoire les objets consomment-ils, et à quelle fréquence les utilisateurs basculent-ils entre deux contrôleurs?)

+0

Super - merci pour l'explication détaillée, qui me l'efface vraiment :) – Smikey

1

Ils sont tous deux OK. Lorsque vous poussez SomeViewController dans la pile, son nombre de rétention est incrémenté. Lorsqu'il est retiré de la pile, son compte de retenue est à nouveau décrémenté. Vous n'avez pas besoin de le relâcher explicitement par la suite. En fait, cela pourrait provoquer une exception.

Il existe une règle générale simple: lorsque vous appelez alloc/retain/new/copy*, vous devez appeler release un jour.

Vous appelez seulement alloc une fois ici, donc vous devez appeler release qu'une seule fois. Editer: dans la seconde approche, vous appelez implicitement retain en utilisant le setter. Donc, dans ce cas, vous aurez besoin d'un release supplémentaire plus tard pour éviter une fuite de mémoire.

+0

Je vois, merci. Content de savoir que la première approche est OK. Mais re: votre édition - sûrement depuis que j'utilise une propriété, je ne devrais pas essayer de la sortir de la méthode dealloc? Sinon, je devrais appeler [release self.iVarViewController] et probablement vous ne devriez jamais faire ça? – Smikey

Questions connexes