Question

Voici l'essentiel de quelque code que je vous écris. Je crains que je ne traite pas correctement les retenir / libérer des problèmes avec la méthode de classe de tableau sur NSMutableArray. La mémoire suivante en fait une fuite?

for(a while) { 
    // do stuff
    NSMutableArray *a = nil;
    // do stuff
    if (!a) {
        a = [NSMutableArray array];
    }
} // for(a while)
Était-ce utile?

La solution

Vous ne fuite de mémoire dans ce code, et en libérant le tableau vous allez provoquer un plantage lorsque le tableau est autoreleased à la fin de la boucle d'exécution.

La plupart des classes de cacao offrent deux façons de faire un nouvel objet, et sont très compatibles avec cette convention:

  1. [[NSSomeObject alloc] init]: vous êtes responsable de la libération de l'objet (par exemple méthode)

  2. .
  3. [NSSomeObject someObject]: l'objet sera autoreleased pour vous, généralement à la fin de la boucle d'exécution (méthode de classe). Il est à peu près équivalent à [[[NSSomeObject alloc] init] autorelease].

L'utilisation correcte de la méthode d'instance serait:

a = [[NSMutableArray alloc] init];
// do stuff
[a release];

L'utilisation correcte de la méthode de classe serait:

a = [NSMutableArray array];
// do stuff, array is in the autorelease pool

Notez qu'Apple vous a recommandé de rester loin des méthodes pratiques, autant que possible pour améliorer les performances. Ceci est controversée conseil, ne peut pas gagner beaucoup de temps processeur, et sépare la alloc-init de la version sur un objet que vous ne se soucient pas en fait beaucoup à garder.

Autres conseils

C'est valide. Il peut aider à gérer simplement les choses manuellement lorsque vous avez des questions, d'apprendre.

Il existe une convention:

  • préfixes (init init, initWithString :) indique un nombre de retenir 1, où
  • préfixes objectname (string, stringWithString :) indique un objet autoreleased

J'ai eu l'habitude, pendant des années, pour libérer ce que je peux sur le site d'appel, plutôt que de le pousser à autoreleased. Certains problèmes de autorelease deviennent alors douloureusement difficiles à traquer. Bien sûr, autorelease est pratique pour le programmeur dans ce cas (rien prévu va mal), mais affecte négativement la réutilisation, la clarté et la performance (moreso dans les grandes codebases / programmes).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top