Comme notes, les variables locales sont allouées dans le cadre de la pile en cours. Dès que l'appel de fonction en cours revient, la pile est "sautée" et la mémoire occupée pour l'appel en cours n'est pas libérée tant qu'elle est abandonnée, jusqu'à ce qu'elle soit écrasée par l'appel suivant qui est poussé dans cette partie de la pile.
Alors, pourquoi devons-nous libérer des variables comme ceci:
MyClass *myObject = [[MyClass alloc] init];
Eh bien, vous ne fait pas à vous soucier de « myObject ». Il est sur la pile, tout comme vos ints, et il sera nettoyé lorsque l'appel en cours se terminera. Ce dont vous avez à vous soucier est la mémoire que myObject - qui est un pointeur - indique. C'est quelque part sur le tas. Construire un objet implique de demander à l'exécution d'une place semi-permanente de le mettre; ce processus renvoie une adresse mémoire que votre pointeur stocke.
alloc
et release
sont idiomes Objective-C qui a largement remplacer les fonctions de C malloc()
et free()
, mais tous, finalement, demandent l'ordinateur de mettre de côté la mémoire sur le tas, et tous que la mémoire doit finalement être renvoyé, soit par un pool d'autorelease, un message release
ou un appel free()
.
+1 pour cette phrase: "Eh bien, vous n'avez pas à vous soucier de" myObject ", il est sur la pile, tout comme vos ints, et il sera nettoyé quand l'appel en cours se terminera.". Ce fait est important de mentionner puisque beaucoup de gens inexpérimentés ne l'obtiennent pas. – monoceres
Une autre chose qui mérite d'être soulignée: ints et autres valeurs des types primitifs ne sont pas des objets Cocoa ou CF, c'est pourquoi (1) vous ne les gérez pas de la même façon que les objets Cocoa et CF (ils n'ont pas de rétention count), (2) vous ne pouvez leur envoyer aucun message, et (3) vous ne pouvez pas les placer directement dans des objets de collection Cocoa ou CF; vous devez les placer dans des objets de valeur tels que NS/CFNumber ou NS/CFString et les placer dans vos collections. NSInteger, NSUInteger, CFIndex et CGFloat ne sont que d'autres noms (typedefs) de types primitifs, donc tout ceci est également vrai pour eux. –
Si vous créez un objet avec alloc init dans un appel de fonction, devez-vous le libérer dans cet appel de fonction ou le traiter automatiquement comme les variables locales? –