2010-07-14 3 views
0

je ne pouvais pas comprendre pourquoi ce code est marqué comme ayant des fuites de mémoire:Pourquoi les instruments marquent-ils les fuites de mémoire sur UIColor et NSArray?

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  

    MenuViewController *menuView = [[MenuViewController alloc] initWithNibName:@"MenuView" bundle:[NSBundle mainBundle]]; 
    navigationController = [[UINavigationController alloc] initWithRootViewController:menuView]; 
    navigationController.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"livreto-verso-horizontal.png"]]; // memory leak here 47,1% 
    [menuView release]; 
    BilheteViewController *rightView = [[BilheteViewController alloc] initWithNibName:@"BilheteView" bundle: [NSBundle mainBundle]]; 
    spliViewController.viewControllers = [NSArray arrayWithObjects:navigationController, rightView, nil]; // memory leak here 52,9% 
    [window addSubview:spliViewController.view]; 

    [window makeKeyAndVisible]; 

    [rightView release]; 

    return YES; 
} 

Juste les lignes marquées avec des problèmes:

navigationController.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"livreto-verso-horizontal.png"]] 

et

spliViewController.viewControllers = [NSArray arrayWithObjects:navigationController, rightView, nil]; 

Comment puis-je résoudre cette fuite?

Update 1

méthode dealloc App délégué, à la fois NavigationController et spliViewController sont libérés:

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

Répondre

1

L'outil de fuites vous montre où quelque chose qui fuit, a été alloué. Par conséquent, après avoir assigné ces valeurs, elles n'ont jamais été libérées - ce qui semble indiquer que votre contrôleur de navigation n'est pas libéré alors qu'il devrait l'être.

+0

J'ai mis à jour la question avec la méthode dealloc qui libère mon contrôleur de navigation. Je ne pense pas que ce soit faux. Le faites vous? –

+0

Étant donné que vous configurez cette vue dans le délégué de l'application, cette dernière ne doit jamais être appelée. Normalement, vous ne libérerez jamais un contrôleur de navigation dans un contrôleur de vue. –

+0

Bonjour Kendall, quelle méthode devrais-je utiliser pour libérer les contrôleurs sur un délégué d'application? applicationWillFinish? –

0

Est-il possible les seules références aux objets que vous voyez des fuites sont dans d'autres objets qui fuient aussi?

Par exemple, vous allouez un contrôleur de navigation ici:

navigationController = [[UINavigationController alloc] initWithRootViewController:menuView]; 

Le UIColor sera retenu par cette NavigationController lorsque vous attribuez à backgroundColor.

Libérez-vous quelque part la référence à ce module de navigationController?

+0

Oui, la navigationController est libérée sur la méthode dealloc de mon délégué d'application (même classe où elle est allouée). –

+0

Y a-t-il d'autres éléments que vous affectez à navigationController? Je pense que vous devrez peut-être poster plus de code. Y a-t-il d'autres objets qui fuient? – JosephH