2

Actuellement, j'ai une application basée sur la navigation et évidemment le RootViewController est un UITableView. Cependant, j'ai jugé nécessaire de créer un UIToolbar qui flotte au-dessus de UITableView. Actuellement, je fais ça comme ça.UIToolbar Memory Leak

Cependant, après avoir utilisé l'outil d'instrument Fuites, j'ai pu déterminer que ce fut la cause de quelques fuites de mémoire, que de petites, mais les fuites de mémoire quand même. J'ai ensuite creusé encore plus loin et j'étais capable de localiser les lignes exactes qui causent les fuites de mémoire. Ils sont les suivants. J'ai du mal à comprendre comment supprimer ces fuites de mémoire et ainsi rendre mon application plus fluide. Toute aide serait appréciée pour savoir pourquoi les lignes ci-dessus provoquent des fuites!

Répondre

3

Une nouvelle barre d'outils est créée chaque fois que la vue s'affiche, qu'elle est ajoutée à la vue et qu'elle n'est jamais diffusée. Cela signifie que cette barre d'outils et son élément de bouton de barre dureront éternellement. Vous pouvez résoudre ce problème en relâchant simplement la barre d'outils après l'avoir ajoutée à la vue ou en lui envoyant le message autorelease lorsque vous le créez. Donc, d'une manière décente de le faire serait de remplacer:

toolbar = [[UIToolbar alloc] init]; 

avec:

toolbar = [[[UIToolbar alloc] init] autorelease]; 

De plus, la façon dont vous faites cela, chaque fois que votre vue vous semble finir par ajouter une autre barre d'outils à la vue du contrôleur de navigation. Donc, vous avez presque certainement quelques-uns de ces objets assis les uns sur les autres (ainsi vous verrez toujours des fuites jusqu'à ce que la vue de navigation disparaisse enfin). Ce que vous pourriez vouloir faire est de garder cette barre d'outils comme un ivar. Lorsque votre vue disparaît, supprimez la barre d'outils de la vue du contrôleur de navigation. Quand il apparaît, ajoutez-le. Créez la barre d'outils elle-même dans votre méthode viewDidLoad et nettoyez-la dans viewDidUnload puis relâchez-la dans dealloc. Donc, votre nouvelle classe pourrait ressembler à ceci (supposons que vous créez une propriété synthétisée nommée barre d'outils qui est retenue):

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    UIToolbar* toolbar = [[[UIToolbar alloc] init] autorelease]; 
    // set up toolbar 
    [self setToolbar:toolbar]; 
    // other load code 
} 

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    [[[self navigationController] view] addSubview:[self toolbar]]; 
    // other vwa code 
} 

- (void)viewDidDisappear:(BOOL)animated 
{ 
    [super viewDidDisappear:animated]; 
    [[self toolbar] removeFromSuperview]; 
} 

- (void)viewDidUnload 
{ 
    [self setToolbar:nil]; 
    [super viewDidUnload]; 
} 

- (void)dealloc 
{ 
    UIToolbar* toolbar = [self toolbar]; 
    [toolbar removeFromSuperview]; // shouldn't ever need this, but be safe 
    [toolbar release]; 
    // other dealloc 
    [super dealloc]; 
}