Définition d'un objet nul par rapport à la libération + realloc

voix
9

Ce n'est pas un environnement recueilli des ordures

J'ai une variable d'instance de classe qui, à un moment donné dans mon exécution, je dois re-initialiser avec un ensemble de données différent de ce qu'il a été construit avec.

Hypothétiquement, si j'ai un NSMutableArrayou NSMutableDictionary, serait - il plus efficace de faire quelque chose comme:

[myArr release];
myArr  = [[NSMutableArray alloc] init....];

ou juste,

myArr = nil;

Est-ce que myArr libérer l'objet et laissez-moi sans un pointeur sur le stockage en mémoire que je peux réutiliser myArr?

Créé 09/03/2009 à 17:03
source utilisateur
Dans d'autres langues...                            


6 réponses

voix
21

Si vous le faites myArr=nil;par lui - même, alors vous avez perdu le pointeur auquel vous pouvez envoyer le releasemessage. Il n'y a pas de magie à releasevotre objet.

Et, comme le dit Georg, sans être en mesure de libérer votre objet, que la mémoire a « fuite ».

Créé 09/03/2009 à 17:07
source utilisateur

voix
6

Vous pouvez utiliser une propriété et obtenir presque la syntaxe que vous voulez sans la fuite de mémoire.

Utilisez cette syntaxe pour déclarer le tableau

@property (readwrite, retain) NSMutableArray *myArray;

Puis ré-initialiser comme ceci:

[self setMyArray:[NSMutableArray array]];
Créé 09/03/2009 à 17:59
source utilisateur

voix
5

Si vous étiez sous Mac OS, iPhone OS ne je dirais que cela dépend du fait que le garbage collector est activé ou non:

  • avec GC: utilisation myArr = nil;
  • sans GC: utilisation [myArr release];

Malheureusement, sur l'iPhone, il n'y a pas la collecte des ordures, donc si vous ne voulez pas les fuites de mémoire, vous devez libérer votre objet une fois que vous ne avez plus besoin.

Créé 09/03/2009 à 17:13
source utilisateur

voix
4

Le premier bloc de code est très bien. Cependant, le deuxième bloc ne vous laisse pas avec un tableau, vous pouvez utiliser donc il ne suffit pas. corriger la moitié de ce bloc, je pense que vous voulez dire:

myArr = nil;
myArr = [[NSMutableArray alloc] init....];

Cependant, cela ne permet pas d'atteindre ce que vous voulez soit parce que vous n'êtes pas myArr publiez. Si vous avez synthétisé un setter pour myArr, vous pouvez obtenir le comportement de libération que vous voulez de la mise à zéro, en utilisant le dispositif de réglage (self.myArr) au lieu d'accéder au pointeur directement (myArr). La correction complète de votre deuxième bloc:

self.myArr = nil;
myArr = [[NSMutableArray alloc] init....];

Maintenant, nous avons des exemples de code équivalents, en utilisant un setter à un montant nul pour libérer, l'autre non. Ce sont les mêmes.

Si myArr est un tableau mutable comme dans ces exemples, la méthode la plus efficace est d'utiliser removeAllObjects, évitant tout le travail de ce libérer de la mémoire seulement pour réclamer:

[myArr removeAllObjects];
Créé 02/12/2009 à 11:08
source utilisateur

voix
1

Si ce que vous voulez est de réinitialiser le contenu d'un NSMutableArray / NSMutableDictionary, vous pouvez également appeler removeAllObjects et vous avez un tableau frais / dict de travailler avec.

Créé 13/03/2009 à 22:37
source utilisateur

voix
1

Une façon de comprendre la différence pourrait être ceci: Définition d'une référence à un objet à zéro ne fait rien à l'objet, il ne fait que quelque chose à la référence.

« Libérer l'objet » ne « rien », il ne le fait pas. :) Dans une langue ramasse-miettes, il pourrait le faire comme un effet secondaire de laisser tomber la référence, mais dans l'objectif C, il ne fonctionne pas de cette façon.

Créé 09/03/2009 à 17:09
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more