El método dealloc se invoca en un objeto cuando su recuento de retención ha llegado a cero. Los recuentos de retención se incrementan en uno por cada llamada retain
, y se reducen una vez por cada llamada a release
. El autorelease
planifica una futura llamada a release
cuando se vacía el NSAutoreleasePool actual, generalmente al final de un ciclo de evento, pero puede configurar sus propios NSAutoreleasePools en operaciones que requieren mucha memoria. (Consulte los documentos de NSAutoreleasePool para obtener más información.)
¿Qué debe poner en dealloc? Debe poner un lanzamiento para cada objeto miembro que el objeto de esa clase conserva.
Un par de cosas lo hacen más fácil. El objeto nil ignorará silenciosamente cualquier mensaje enviado a él, por lo que [foo release] cuando foo = nil no es un error. Sin embargo, liberar un objeto dos veces puede causar problemas graves. Mi (casi única) solución para esto es establecer explícitamente lo que acabo de lanzar a cero, cada vez que lo publico. De hecho, puse la asignación nil en la misma línea que el lanzamiento, así que puedo grep para "liberar" y encontrar lugares que me perdí. Ejemplo:
@interface MyClass {
Foo *foo;
Bar *bar;
NSInteger baz;
}
-(void)dealloc;
@end
@implementation MyClass
-(void)dealloc {
[foo release]; foo = nil;
[bar release]; bar = nil;
[super dealloc];
}
@end
voy a asignar a una variable nula incluso cuando esa variable está a punto de salir del alcance o el objeto está a punto de desaparecer. ¿Por qué?Si se asigna otro objeto de la misma clase en el mismo espacio de memoria después de que haya lanzado este, garantiza que no habrá punteros colgantes que el nuevo objeto pueda usar accidentalmente y que la depuración sea una pesadilla. (Consulte también NSZombieEnabled for depugging help.)
Puede usar comas para separar las instrucciones en una línea. por ejemplo '[foo release], foo = nil;' etc. – Abizern
Interesante. ¿Es mejor? –
No, solo más confuso. Es el operador de coma ('a, b') que da como resultado el resultado de la expresión correcta (si usa el valor en alguna parte, por ejemplo' x = y, z; '). –