Différence entre et 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 arrays avec alloc, et si à la fin d'une certaine fonction je renvoyais le tableau créé avec alloc, je devais autoéliminer ce tableau, en raison de problèmes de fuite de memory.

Maintenant, en utilisant la première déclaration, je n'ai pas besoin de publier quoi que ce soit.

Merci

Parce qu'au début, je déclarais tous mes arrays avec alloc et si à la fin d'une certaine fonction je renvoyais le tableau créé avec alloc je devais autoéliminer ce tableau, car les problèmes de fuite de memory. Maintenant, en utilisant la première déclaration, je n'ai pas besoin de rien publier

C'est exactement correct quand vous "vendez" un object. Mais dans d'autres cas, lorsque vous créez un object sur iOS, où vous avez le choix entre l'obtention d'un object autoreleased prêt à l'emploi et l'appel suivi d'une release, Apple vous request d'utiliser alloc et release, car cela conserve la vie de l'object court et sous votre contrôle.

Le problème ici est que les objects autoreleased vivent dans le pool autorelease et peuvent s'emstackr jusqu'à ce que la piscine soit drainée, quand cela peut être.

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

EDIT – 12/18/2011: Mais avec iOS 5 et l'avènement d'ARC, le mécanisme d'autorelease est beaucoup plus efficace, et il n'y a pas de release , donc la distinction entre alloc-init et un constructor de commodité vendant un object autoreleased devient discutable. (De plus, il s'agit maintenant d'un bloc @autoreleasepool plutôt que d'un pool de pseudo-autorelease.)

La méthode de class array produit elle-même un tableau autoreleased, ce qui signifie que vous ne devez pas (et ne devez pas) le libérer manuellement.