2009-10-05 6 views
2

L'instrument Leaks m'indique que j'ai une fuite dans ce fragment de code. Pourquoi cela est-il ainsi? Ce fragment de code est viewDidLoad().Problème de fuite de mémoire de l'objectif C

UINavigationItem *navItem=[self navigationItem]; 

UIBarButtonItem *addFeed = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addFeed)]; 
[navItem setRightBarButtonItem:addFeed]; // leaks says that 128 bytes leaked 
[addFeed release]; 

UIBarButtonItem *reload = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(reload)]; 
[navItem setLeftBarButtonItem:reload]; // leaks says that 128 bytes leaked here too ! 
[reload release]; 
[navItem release]; 

Répondre

6

Vous ne devriez pas publier navItem. Vous n'avez pas alloué/conservé/nouveau/créé, donc vous ne le libérez pas.

Autre que cela, votre code semble bien. Est-ce tout dans la méthode?

3

L'instrument de fuite vous indique seulement où la mémoire a été allouée; il ne peut pas vous dire où la mémoire aurait dû être libérée, mais elle ne l'était pas, car il n'y a aucun moyen de le savoir. Votre fuite se produit ailleurs.

Ce code est généralement bon, sauf que vous ne devriez pas publier navItem à la fin. Vous n'en êtes pas un propriétaire, puisque vous ne l'avez pas créé avec une méthode nommée alloc, new, ou copy dans son nom, vous ne devriez donc pas le publier.

0

Avez-vous NSZombieEnabled? Cela provoque des objets ne pas être conservés par les instances NSZombie et vous verrez "fuites" lors de l'exécution de l'outil fuites.

0

Il semble que vous ne libérez pas le contrôleur de vue avec la méthode personnalisée viewDidLoad.

2

si vous obtenez toujours le message de fuite et ne peut pas le bug, vous pouvez essayer d'utiliser l'analyseur statique inclus dans le dernier et le plus grand Xcode (version 3.2)

Construire> Construire et analyser

il utilisera LLVM-Clang pour analyser votre code de manière statique.

http://developer.apple.com/mac/library/featuredarticles/StaticAnalysis/index.html

MISE À JOUR:

dans l'extrait de code:

UINavigationItem *navItem=[self navigationItem]; 

UIBarButtonItem *addFeed = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addFeed)]; 
[navItem setRightBarButtonItem:addFeed]; // leaks says that 128 bytes leaked 
[addFeed release]; 

votre fuite est probablement vient de mettre la nouvelle rightBarButtonItem sans relâcher l'ancien.

ce que je pense qui se passe:

1) obtenir une poignée à la navigationItem (a barre de boutons droit A)

2) créer un nouveau UIBarButton article (faisant le bouton barre de droite B)

3) setRightBarButtonItem au bouton B

maintenant où est le bouton A? il aurait dû être publié par navItem lorsque vous avez défini le nouveau bouton. Vous auriez donc pu oublier de relâcher le bouton lorsque vous l'avez défini pour la première fois, ou vous l'avez conservé ailleurs.

+0

quelques autres réflexions ... rightBarButtonItem est @property (nonatomic, retain) UIBarButtonItem * rightBarButtonItem, il devrait donc libérer l'ancien avant de conserver le nouveau. Donc, peut-être ailleurs dans votre code, vous retenez l'ancien bouton ou ne le relâchez pas après l'avoir réglé la première fois – pxl

0
[navItem setRightBarButtonItem:addFeed]; 

[navItem setLeftBarButtonItem:reload]; 

Vous créez des copies des objets dans ces accesseurs. Ces accesseurs incrémentent le retainCount de 1. Vos accesseurs doivent libérer chaque objet et les conserver immédiatement.

Exemple:

- (void) setTitle: (NSString*) newTitle { 
    if (title != newTitle) { 
     [title release]; 
     title = [newTitle retain]; // Or copy, depending on your needs. 
    } 

Jetez un oeil sur les techniques ici: Memory Management Programming

Je crois que ce qui se passe. Alors jetez un coup d'œil à ces deux accesseurs.