2009-10-01 28 views
7

Si creo un objeto nuevo que incluya dos punteros a objetos (ver a continuación) cuando se crea el objeto, los punteros se configuran para señalar nulo;¿Está bien lanzar un puntero que sea nulo?

@interface rocketShip : NSObject { 
    NSString *name; 
    NSNumber *thrust; 
} 

Si (por alguna razón inesperada) no asignar estos punteros y posterior liberación en mi método es que dealloc bien, estoy bastante seguro de que es, sólo quería comprobar?

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

Gary

+2

Recuerda llamar '[super dealloc]' al final de tu implementación 'dealloc'. – Jason

+0

Lo siento Jason, lo sabía, pero de alguna manera se perdió en el corte y pegado. – fuzzygoat

Respuesta

22

El envío de un mensaje a nil no causará un error, por lo que esto está muy bien. Sin embargo, debes asegurarte de que los punteros sean realmente nulos: enviar un mensaje a un puntero a basura probablemente cause errores.

7

Sí, puede hacerlo porque puede enviar un mensaje de manera segura (como release) al nil y simplemente no hará nada.

1

Si utiliza la propiedad de acceso para crear sus métodos get/set:

@interface rocketShip : NSObject { 
    NSString *name; 
    NSNumber *thrust; 
} 

@property (retain, nonatomic) NSString *name; 
@property (retain, nonatomic) NSNumber *thrust; 

Y en su archivo .m:

@synthesize name; 
@synthesize thrust; 

continuación, puede simplemente establecer la variable a cero en dealloc . De hecho, esto llamará a su incubadora y reducirá el recuento de referencias en uno y limpiará las cosas.

+0

Vincent, este es un muy buen punto, solo estoy leyendo acerca de @property & @synthesize en este momento. Solo quería poner la vieja escuela en mi cabeza antes de ir más hacia Objective-C 2.0 – fuzzygoat

+1

Como aclaración, tendrías que escribir self.name = nil en dealloc. Simplemente establecer name = nil sería una fuga, excepto bajo GC. – sbooth

+3

Aunque funcionará en el caso más simple, la sugerencia de Vincent no es la mejor práctica. Usando 'self.name = nil' en el método dealloc llamará a su método setter. Si una subclase (o usted) anula este método de establecimiento de modo que tenga efectos secundarios o dependa del estado de la instancia, puede romperse cuando se llame desde dealloc, donde no se determina el estado de la instancia. Es * mucho * mejor llamar [liberación del nombre]. –

0

En Objective-C es importante distinguir entre objetos y variables. No puede liberar un puntero (el valor de una variable), solo puede liberar un objeto (el objeto al que se refiere un puntero). Un puntero nulo se refiere a ningún objeto, por lo que los mensajes enviados a nil no hacen nada (lo que generalmente es seguro).

Cuestiones relacionadas