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 retain
release
, 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!!!
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
¡¡¡Gran respuesta !!!. Muchas gracias. –