Tout d'abord, Objective-C le langage de programmation n'a aucun concept de gestion de la mémoire. La gestion de la mémoire est intégrée dans la base de données (cadre commun de Cocoa pour Mac OS X et Cocoa Touch sur iPhone OS). Foundation ajoute un NSObject de classe de racine qui implémente alloc
, retain
, release
et autorelease
comme wrappers de commodité au-dessus des fonctions class_createInstance()
et object_dispose()
de l'exécution Objective-C. Depuis Objective-C est agnostique de gestion de la mémoire, l'ajout de garbage collection et rendant toutes les méthodes de gestion de la mémoire sur NSObject
no-ops était assez facile. Mais il n'y a pas de ramasse-miettes sur iPhone OS et sur Mac OS X hérité et nous utilisons plutôt un schéma de comptage de référence dans Cocoa.
Un objet est créé lors de l'appel de la méthode de classe alloc
sur NSObject
ou NSProxy
à partir de Foundation. Ces implémentations par défaut appellera class_createInstance()
de sorte que vous n'avez jamais besoin de manuellement.
Un objet "meurt" lorsque dealloc
est exécuté sur la classe racine NSObject
. Ceci est lorsque la mémoire de l'objet sur le tas est libéré en appelant object_dispose()
, vous ne devez appeler cette fonction vous aussi longtemps que vous héritez de NSObject
ou NSProxy
de la Fondation.
Les objets libérés ne sont pas traités de manière spéciale en ce qui concerne l'exécution, un objet autoreleased est tout aussi vivant que n'importe quel autre objet. Qu'est-ce qui se passe quand vous autorelease
un objet est environ;
-(id)autorelease; {
[NSAutoreleasePool addObject:self]; // retain count +1
[self release]; // retain count -1
return self;
}
appel autorelease
ne décrémenter le conserver nombre, il sera tout simplement transférer la propriété de l'objet de l'appelant à la piscine actuelle autorelease. Plus tard, lorsque le pool d'autorelease en cours disparaîtra, il appellera release
sur tous les objets dont il est propriétaire, et tout objet qui n'appartient plus à rien d'autre est libéré.
Dans quel environnement? –
Désolé Rafal, Édité pour inclure Objective-C – fuzzygoat
Cela vaut vraiment la peine de mentionner ici que le nombre de retenues n'atteint jamais 0. Lorsque vous faites la version finale, la décimation de 1 à 0 est une perte de temps CPU (: – Jacob