2009-09-13 14 views
15

Después de soltar objetos, ¿es mejor configurar los punteros a cero? Eso es lo que he estado haciendo, solo quería preguntar si es necesario, una buena práctica o una exageración.¿Configura punteros a cero después del lanzamiento?

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

.

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

aplausos -gary-

Respuesta

20

depende del alcance de la variable que contiene el puntero. Siempre configuro punteros a cero si continúan existiendo dentro del alcance, en caso de que vuelva a llamar a la variable en otro lugar. De lo contrario, existe el riesgo de que acceda a una ubicación de memoria que contenía un objeto que ahora se ha liberado.

Pero si la variable está fuera del alcance, tampoco se usará, por lo que asignarle nada es un poco exagerado. Aún así, es una buena práctica asignar simplemente nil solo en caso de que alguien más decida agregar código a su código y accidentalmente use la variable nuevamente dentro de su alcance, pero después de que se haya liberado.

+1

gracias, muy apreciado. – fuzzygoat

+0

He visto un código donde las personas configuran nil primero y luego lanzan. Eso resulta en [liberación nula] que no hace nada. Entonces, para aquellos que se preguntan si el orden es importante, ¡sí lo es! – pnizzle

1

Se considera una buena práctica. Si configura sus punteros a nil después de soltarlos, entonces, en caso de que haga un mal uso de su variable en un punto posterior de ejecución, obtendrá un error apropiado.

6

Normalmente cuando programo en C/C++ lo configuro en nulo. ¿Por qué? Porque incluso si libera la memoria apuntando, el puntero aún conserva la dirección de esa memoria liberada. Puede causar serios problemas de infracción de acceso en código como este:

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

Si ha configurado el puntero a null, esto nunca ocurrirá

0

A veces esto puede ser crucial, como acabo de descubrir. Uso una cámara en mi juego que mantiene un puntero a un objetivo genérico. Si regresas al menú principal desde un nivel, borra el nivel de la memoria pero mantiene la cámara y las capas del juego.

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

Dado que la cámara va a existir ya que el objetivo, lo mejor es establecer objetivo a cero, de lo contrario cuando se carga el nivel de nuevo y se establece un nuevo objetivo:

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

que se colgará en ese liberar si el objetivo es basura y no es nulo. Enviar un mensaje a nil está bien, pero no a una memoria no deseada arbitraria. Eso me da un EXC_BAD_ACCESS.

Cuestiones relacionadas