web-dev-qa-db-fra.com

Différence entre [tableau NSMutableArray] et [[NSMutableArray alloc] init]

quelqu'un peut-il me dire la différence en déclarant un tableau mutable avec:

NSMutableArray *array = [NSMutableArray array];

et

NSMutableArray *array = [[NSMutableArray alloc] init];

Parce qu'au début, je déclarais tous mes tableaux avec alloc, et si à la fin d'une certaine fonction, je retournais le tableau créé avec alloc, je devais libérer automatiquement ce tableau, en raison de problèmes de fuite de mémoire.

Maintenant, en utilisant la première déclaration, je n'ai besoin de rien divulguer.

Merci

55
Adelino

Parce qu'au début, je déclarais tous mes tableaux avec alloc et si à la fin d'une certaine fonction je retournais le tableau créé avec alloc, je devais libérer automatiquement ce tableau, car des problèmes de fuite de mémoire. Maintenant, en utilisant la première déclaration, je n'ai rien à publier

C'est exactement correct lorsque vous "vendez" un objet. Mais dans d'autres cas, lorsque vous créez un objet sur iOS, où vous avez le choix entre obtenir un objet prêt à l'emploi autorémandé et appeler alloc suivi d'une libération, Apple veut que vous utilisiez alloc et release , car cela maintient la durée de vie de l'objet courte et sous votre contrôle.

Le problème ici est que les objets libérés automatiquement vivent dans le pool de libération automatique et peuvent s'accumuler jusqu'à ce que le pool soit vidé, quand cela est possible.

Une autre chose à surveiller est les boucles. Vous pouvez générer des objets libérés automatiquement sans le savoir, et ils s'accumulent simplement dans la piscine. La solution consiste à créer votre propre pool de libération automatique au début de la boucle et à le libérer à la fin de la boucle, afin que les objets soient libérés à chaque fois à travers la boucle.

EDIT - 18/12/2011: Mais avec iOS 5 et l'arrivée d'ARC, le mécanisme de libération automatique est beaucoup plus efficace, et il n'y a rien de tel que release, donc la distinction entre alloc-init et un constructeur de commodité vendant un objet libéré automatiquement devient théorique. (C'est aussi maintenant un @autoreleasepool bloquer plutôt qu'un objet (pseudo-) de pool à libération automatique.)

31
matt

La méthode de classe array produit à elle seule un tableau auto-libéré, ce qui signifie que vous n'avez pas (et ne devriez pas) le libérer manuellement.

37
BoltClock