Vous ne fuite de mémoire dans ce code, et en libérant le tableau vous provoquera un plantage lorsque le tableau est autoreleased à la fin de la boucle d'exécution.
La plupart des classes Cocoa fournissent deux façons de faire un nouvel objet, et sont très compatibles avec cette convention:
[[NSSomeObject alloc] init]
: vous êtes responsable de la libération de l'objet (par exemple méthode).
[NSSomeObject someObject]
: l'objet sera automatiquement libéré pour vous, généralement à la fin de la boucle d'exécution (méthode de classe). C'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 de les méthodes de commodité autant que possible pour améliorer les performances. Ceci est controversial advice, peut ne pas économiser beaucoup de temps processeur, et sépare l'alloc-init de la version sur un objet que vous ne vous souciez pas vraiment de garder.
Excellent ensemble de réponses. Merci beaucoup. – dugla
Salut, Je suis arrivé à une conclusion de votre réponse. S'il vous plaît dites-moi, j'ai raison? Donc, il est bon d'allouer et libérer de la mémoire que autorelease pour la programmation iPhone. Nous devrions utiliser des méthodes moins autorelease. Merci. –
Oui, vous devriez limiter votre utilisation de 'autorelease'. C'est pratique, mais les objets auto libérés resteront dans le pool autorelease jusqu'à la prochaine fois sur la boucle d'exécution. Les objets explicitement libérés seront désalloués plus ou moins immédiatement. –