2010-02-15 8 views
5

L'instrument Leaks de Xcode me montre ici une fuite de mémoire. J'ai commenté la ligne touchée dont Leaks se plaint. Mais je ne vois aucune erreur dans ma gestion de la mémoire ...Pourquoi ce code produit-il une fuite de mémoire?

- (void)setupViewController { 
    MyViewController *myVC = [[MyViewController alloc] init]; 

    UITabBarItem *tbi = [[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemDownloads tag:1]; 
    myVC.tabBarItem = tbi; // LEAK: 128 bytes 

    self.myViewController = myVC; 

    [myVC release]; 
    [tbi release]; 
} 

Je veux dire ... et tbi myVC est libéré à la fin, et le alloc est équilibré. Alors, qu'est-ce qui ne va pas? Je ne comprends pas.

Répondre

3

Si MyVc.tabBarItem est déjà défini, tout ce qu'il pointe peut ne pas être désalloué correctement, ce qui provoque une fuite.

+0

La propriété tabbar de myVC doit être une propriété définie pour être conservée. Si vous faites cela, la rétention des objets assignés à la propriété sera maintenue automatiquement. – TechZen

+0

bien, mais tabBarItem vient d'Apple, pas de moi ;-) Je n'ai créé aucune propriété tabBarItem pour mon View Controller. Apple a fait. Ce serait contre les règles de gestion de la mémoire si je libère myVC.tabBarItem manuellement parce que Apple a oublié de le faire, n'est-ce pas? – dontWatchMyProfile

+0

'tabBarItem' est une propriété avec la sémantique' retain'. Il est très improbable qu'il y ait une fuite dans le setter. –

2

Il va juste pour montrer qu'au moins l'une des affirmations suivantes est remplie:

  1. Instruments est pas parfait et montre parfois des fuites où il n'y a pas (et vice versa).
  2. Le code d'Apple n'est pas sans bug.

En fait, les deux sont vrais.

Questions connexes