Objective C : gestion de la mémoire
mardi 18 septembre 2012Par défaut Xcode, créé les projets avec ARC activé. ARC rend impossible la gestion manuelle de la mémoire.
Si on veut gérer soit même la mémoire il faut désactiver ARC dans Build Settings > faire une recherche sur « Objective C Automatic Reference Couting » et le mettre à False. Dans le cas ou on veut pas gérer manuellement la mémoire il ne faut plus avoir de release / retain / autorelease qui provoqueront des erreurs de compilations.
Pour rappel, tous les objets sont des pointeurs et la gestion de la mémoire se gère avec des compteurs (retaincount).
Quand on alloue (new,copy) un espace mémoire a un objet un retainCount de l’objet est incrémenté. Si ce retainCount est supérieur à 1 cela permet de le garder en vie. Le seul moyen d’incrémenter le retaincount après sa création c’est avec la commande retain. Quand le retainCount est égale à 0, le système se charge de libérer la mémoire. La méthode dealloc de l’objet est appelé. On incrémente le retainCount d’un objet avec le mot clé retain et on le décrémente avec le mot clé release. Toute les variables déclarées retain doivent être release dans la méthode ViewDidUnload. Le mot clé autorelease fait un release mais plus tard dans le temps. Il faut bien évidemment pas faire de release sur un objet en autorelease.
Il est toujours possible d’accéder au retainCount d’un objet via l’instruction suivante:
NSLog(@"retainCount%d",[array retainCount]);
Il n’y a pas de garbage collector dans Objective-C.
ARC n’est pas un garbage collector !
ARC est un mécanisme qui gère lui même à la compilation l’appel des comptages de référence et on ne doit plus se soucier dans le code.
Quelques conseils concernant les soucis de gestions de mémoire:
Un zombie est une méthode appelée alors que l’objet n’est plus en mémoire.
Si on met nil dans un objet et qu’on accède à une méthode de celui-ci, on obtient rien du tout et pas d’erreur.
Erreur EXC_BAD_ACCESS, accès à un objet déjà libéré!
Il existe plusieurs utilitaires dans Xcode pour essayer de résoudre les problèmes de mémoires:
Run > Profile > Leaks : Pour les fuites mémoires
Run > Profile > Zombie : Pour les accès invalide
Il suffit de reproduire l’erreur avec le simulateur et une alerte s’affiche on clique sur la flèche, ensuite une fenêtre s’affiche à droite avec la pile et la on retrouve le fichier qui pose problème et en cliquant dessus on trouve le code qui pose problème.