2009-09-13 4 views
15

Après avoir relâché des objets, est-il préférable de mettre les pointeurs à zéro? C'est ce que j'ai fait, je voulais juste demander si c'est nécessaire, bonne pratique ou exagéré?Définir des pointeurs sur zéro après la publication?

- (void)dealloc{ 
    [planetName release]; // NSString instance variable 
    [super dealloc]; 
} 
@end 

.

- (void)dealloc{ 
    [planetName release]; // NSString instance variable 
    planetName = nil; 
    [super dealloc]; 
} 
@end 

acclamations -Gary-

Répondre

20

En fonction du champ de la variable qui tient le pointeur. Je mets toujours les pointeurs à zéro s'ils continuent d'exister dans la portée, juste au cas où j'appellerais la variable encore ailleurs. Sinon, il y a un risque que j'accède à un emplacement de mémoire contenant un objet qui est maintenant libéré. Mais si la variable est hors de portée, alors elle ne sera pas utilisée non plus, donc l'affecter à zéro est un peu exagéré. Cependant, c'est une bonne pratique d'attribuer juste nil juste au cas où quelqu'un d'autre décide d'ajouter du code à votre code et utilise accidentellement la variable à nouveau dans sa portée mais après qu'elle a été libérée.

+1

merci, très apprécié. – fuzzygoat

+0

J'ai vu un code où les gens se mettent à zéro d'abord puis relâchent. Cela se traduit par [aucune libération] qui ne fait rien. Donc, pour ceux qui se demandent si l'ordre compte, oui c'est le cas! – pnizzle

1

Il est considéré comme une bonne pratique. Si vous définissez vos pointeurs sur après les avoir libérés, vous risquez d'obtenir une erreur correcte au cas où vous utiliseriez votre variable ultérieurement.

6

Habituellement, lorsque vous programmez en C/C++, je le mets à zéro. Pourquoi? Car même si vous libérez la mémoire pointée, le pointeur conserve l'adresse de cette mémoire libérée. Il peut causer un problème de violation d'accès sérieux dans le code comme ceci:

if(myPointer != null) 
{ 
    doSomething(myPointer); 
} 

Si vous avez défini votre pointeur null, cela ne se produira jamais

0

Parfois, cela peut être crucial, comme je viens de le découvrir. J'utilise une caméra dans mon jeu qui garde un pointeur vers une cible générique. Si vous revenez au menu principal à partir d'un niveau, il efface le niveau de la mémoire mais conserve les couches de caméra et de jeu.

-(void) dealloc { 
    [target release]; 
    target = nil; 
    [super dealloc]; 
} 

Comme l'appareil existera plus que la cible, il est préférable de fixer la cible à zéro, sinon lorsque les charges de niveau encore et vous définissez une nouvelle cible:

-(void) setTarget:(CCNode *)aTarget { 
    [target release]; 
    target = [aTarget retain]; 
    [self update:0]; 
} 

Il se bloque sur ce libérer si la cible est indésirable et non nulle. Envoyer un message à zéro est correct, mais pas à une mémoire indésirable arbitraire. Cela me donne un EXC_BAD_ACCESS.

Questions connexes