57 votes

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

quelqu'un peut me dire la différence de déclarer une mutable tableau avec:

NSMutableArray *array = [NSMutableArray array];

et

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

Parce que au début, j'ai été déclarer tous mes tableaux avec les alloc, et si à la fin d'une certaine fonction que j'ai retourné le tableau créé avec alloc, j'ai dû autorelease ce tableau, en raison de problèmes de fuite de mémoire.

Maintenant, à l'aide de la première déclaration, je n'ai pas besoin de libérer quoi que ce soit.

Merci

38voto

BoltClock Points 249668

L' array méthode de classe par elle-même produit une autoreleased tableau, ce qui signifie que vous n'avez pas à (et ne doit pas) la version manuellement.

33voto

matt Points 60113

Parce que au début, j'ai été déclarer tous mes tableaux avec des alloc et si à la fin d'une certaine fonction que j'ai retourné le tableau créé avec alloc j'ai dû autorelease ce tableau, parce que les problèmes de mémoire. Maintenant, à l'aide de la première déclaration, je n'ai pas besoin de libérer quelque chose

C'est exactement correcte lorsque vous "vendre" un objet. Mais dans d'autres cas, lorsque vous créez un objet sur iOS, où vous avez le choix entre l'obtention d'un prêt-à-autoreleased objet et l'appel alloc suivie par la libération, Apple veut vous utiliser d'allocation et de libération, parce que cela permet de maintenir la durée de vie de l'objet à court et sous votre contrôle.

Le problème ici est que autoreleased objets de vivre dans l'autorelease pool et peuvent s'accumuler jusqu'à ce que la piscine est vidée, chaque fois que cela peut être.

Une autre chose à regarder dehors pour est des boucles. Vous pouvez générer autoreleased objets sans en avoir conscience, et ils s'accumulent dans la piscine. La solution est de créer votre propre autorelease pool au début de la boucle et de le libérer à la fin de la boucle, de sorte que les objets sont sorti à chaque fois à travers la boucle.

EDIT - 12/18/2011: Mais avec iOS 5 et l'entrée de l'ARC, l'autorelease mécanisme est beaucoup plus efficace, et il n'y a pas une telle chose comme release, de sorte que la distinction entre les alloc-init et une commodité constructeur de distributeurs automatiques un autoreleased objet devient discutable. (C'est aussi maintenant un @autoreleasepool bloc plutôt qu'un autorelease pool (pseudo-)objet.)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X