2009-11-03 10 views
8

He estado desarrollando con el objetivo C y el marco Cocoa desde hace bastante tiempo. Sin embargo, todavía no está del todo claro para mí, cuando se supone que debo establecer referencias de objeto a nil. Sé que se recomienda hacerlo justo antes de liberar un objeto que tiene un delegado y también debe hacerlo en el método viewDidUnload para las subvistas retenidas. ¿Pero exactamente cuándo se debe hacer esto y por qué? ¿Qué logra exactamente? Gracias de antemano.Objetivo C iPhone cuando establecer referencias de objeto nulo

-Oscar

Respuesta

40

Digamos que tiene un puntero myView definido en la interfaz de la clase:

@interface MyClass { 
    UIView *myView; 
} 

@end 

Luego, en su código, en algún momento, es posible liberar esa variable:

[myView release]; 

Después de hacer eso, myView, el puntero, no apunta a cero, sino que apunta a una dirección de memoria de un objeto que puede que ya no exista (s) ya que acaba de lanzarlo). Entonces, si sucede algo después de esto, como:

[myView addSubview:otherView]; 

obtendrá un error.

Si, por el contrario, hacer esto:

[myView release]; 
myView = nil; 
... 
[myView addSubview:otherView]; 

la llamada a addSubview no tendrá ningún impacto negativo, ya mensajes a cero se ignoran.

Como corolario, puede ver sugerencias de uso de retain propiedades, tales como:

@property(retain) UIView *myView; 

y luego en el código, simplemente hacer:

self.myView = nil; 

Al hacer esto, el descriptor de acceso sintetizado liberará el objeto antiguo y establecerá la referencia en cero en una línea de código. Esto puede ser útil si quiere asegurarse de que todas sus propiedades se liberen y se establezcan en cero.

Una cosa que nunca debes olvidar, es que la gestión de la memoria se realiza por medio de llamadas retainrelease, y no mediante la asignación de nil. Si tiene un objeto con un conteo retenido de 1 y asigna nil a su única variable, tendrá una pérdida de memoria:

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0,0,10,10)]; 
view = nil; 
// You just leaked a UIView instance!!! 
+0

Cada aspirante a programador de Cocoa debería leer esto. He leído Kochan, Hillegass y los documentos de Apple, y todavía me tomó casi 6 meses entender algunos de los conceptos que pgb explicamos aquí. Ahora me parece obvio, pero ciertamente no era antes. voto ++ – refulgentis

+0

¡¡¡Gran respuesta !!!. Muchas gracias. –

Cuestiones relacionadas