2010-01-16 8 views
0

Dans mon AppDelegate, je lance un contrôleur tabBar, auquel un ensemble de navigationController est ajouté sous forme d'onglets. J'utilise le code suivant:fuite de mémoire tabBarController

// Init tabBar Controller 
tabBarController = [[[UITabBarController alloc] init] retain]; 

// Init Root Views of navigation controllers 
FirstRootViewController* firstViewController = [[[FirstRootViewController alloc] init] autorelease]; 
SecondRootViewController* secondViewController = [[[SecondRootViewController alloc] init] autorelease]; 
ThirdRootViewController* thirdViewController = [[[ThirdRootViewController alloc] init] autorelease]; 

// Init Navigation controllers of tabs 
UINavigationController* firstNavController = [[[UINavigationController alloc] initWithRootViewController:firstViewController] autorelease]; 
UINavigationController* secondNavController = [[[UINavigationController alloc] initWithRootViewController:secondViewController] autorelease]; 
UINavigationController* thirdNavController = [[[UINavigationController alloc] initWithRootViewController:thirdViewController] autorelease]; 

firstNavController.navigationBar.barStyle = UIBarStyleBlack; 
secondNavController.navigationBar.barStyle = UIBarStyleBlack; 
thirdNavController.navigationBar.barStyle = UIBarStyleBlack; 

// Create array for tabBarController and add navigation controllers to tabBarController 
NSArray *navigationControllers = [NSArray arrayWithObjects:firstNavController, secondNavController, thirdNavController, nil]; 
tabBarController.viewControllers = navigationControllers; 
[window addSubview:tabBarController.view]; 

Et la fonction dealloc:

- (void)dealloc { 
[window release]; 
[tabBarController release]; 
[super dealloc]; } 

firstNavController sont les contrôleurs de navigation à ajouter qui sont correctement libérés alltogether quelques lignes plus tard (ils sont créés à l'aide alloc). tabBarController est une variable de classe qui a été créée en utilisant @property (nonatomic, retain) et @synthesize tabBarController. Il reçoit une commande de libération dans la méthode dealloc. Maintenant, les instruments me disent que j'ai deux fuites de mémoire sur la ligne avec "tabBarController.viewControllers = navigatioControllers". J'ai torturé ma tête, mais je ne vois pas pourquoi: D'après ce que je comprends, les contrôleurs de navigation devraient être libérés automatiquement et si je lui envoie une commande de libération quelques lignes plus tard, l'application plante, donc je suppose que j'ai raison. Tout devine quoi de mal?

Merci beaucoup!

+0

S'il vous plaît poster le code complet pour l'allocation/désallocation les contrôleurs et barre d'onglets, il n'y a rien à lire dans cet extrait. –

+0

J'ai ajouté le code que vous avez demandé, espérons que cela aide – Robin

Répondre

1

Tout d'abord, votre variable de classe tabBarController a un nombre de références augmenté deux fois. Une fois de la alloc et une fois à partir de la retain dans la première ligne de votre code, mais est seulement publié une fois dans dealloc C'est probablement d'où provient votre fuite de mémoire.

En second lieu, bien que vous avez déclaré un correspondant @property(nonatomic, retain) tabBarController (et mis en œuvre par l'intermédiaire @sysnthesize) vous n'utilisez pas réellement les accesseurs de propriété (et son correspondant conserver le comportement de libération & lors de l'affectation) Pour ce faire, vous devez utiliser self.tabBarController plutôt que tabBarController qui se référera à la variable de classe, pas à la propriété.

Essayez de modifier votre code à ce qui suit pour voir si cela résout votre problème

// Init tabBar Controller 
UITabBarController* tbc = [[[UITabBarController alloc] init]; 
self.tabBarController = tbc; 
[tbc release]; 
... 

- (void)dealloc { 
[window release]; 
self.tabBarController = nil; 
[super dealloc]; } 
+0

Merci pour votre solution. J'ai changé le code comme vous l'avez proposé, mais je n'ai pas réussi à le faire fonctionner. Je ne comprends pas non plus la chose variable de la propriété par rapport à la classe: Quelles sont les principales différences? Jusqu'ici, j'ai toujours utilisé @property et @synthesize pour déclarer des variables de classe. J'utilise exactement le même code que vous avez suggéré, mais je reçois toujours la fuite sur la ligne où les Contrôleurs de Nav/view sont ajoutés. Si j'essaie de les relâcher quelques lignes plus tard, l'appli se bloque (ce qui a aussi du sens car ils devraient être disponibles par la suite). Des idées là-dessus? Merci beaucoup pour votre aide! – Robin

+0

Plutôt que de tout expliquer ici, je vous suggère de lire autant que possible de référence de programmation Objective C d'Apple http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/ObjC.pdf. Les sections pertinentes de ma réponse sont le chapitre sur les «Propriétés déclarées» et la discussion sur l'utilisation de soi lors de l'accès aux propriétés sous «Messagerie Objet». – cidered