2010-07-16 26 views
6

Quiero hacer una pregunta general sobre el objetivo C. Cuando escribo el programa de la aplicación iPhone, siempre veo una función llamada 'dealloc' en el .m. ¿Cuándo se llamará este método? ¿Necesito poner todo el [lanzamiento] aquí para la aplicación? muchas gracias.¿Qué es dealloc en el objetivo C

// ------------------ contenido actualizado ------------------------ -

NSArray *arr; 
NSString *str; 
NSMutableArray *mutableArr; 

// in the dealloc 
// it should have to following 
[arr release]; 
[str release]; 
[mutableArr release]; 

la función se llamará 3 veces?

Respuesta

12

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.)

+2

Puede usar comas para separar las instrucciones en una línea. por ejemplo '[foo release], foo = nil;' etc. – Abizern

+0

Interesante. ¿Es mejor? –

+0

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; '). –

4

¿Cuándo se llamará este método?

Se invoca cuando el recuento de referencias para ese objeto se vuelve 0 porque se han liberado todos sus punteros. La memoria que ocupa es desasignada (liberada); el objeto en sí es destruido.

¿Necesito poner todo el [lanzamiento] aquí para la aplicación?

Sí, libera todas las propiedades del objeto que aún se conservan.

EDIT: En respuesta a su pregunta actualizada, dealloc en su objeto personalizado solo se llama una vez. A continuación, enviará estos tres mensajes:

[arr release]; 
[str release]; 
[mutableArr release]; 

Para cada uno de los tres objetos. Son totalmente objetos diferentes, pero si solo tiene una instancia de cada uno, sus recuentos de referencia bajan a 0 y sus métodosdealloc se llaman automáticamente.

+0

Gracias por su respuesta. Me gustaría preguntar sobre el 'cuándo'. Si tengo 3 objetos, tengo que liberarlos. Entonces uno de los objetos se convierte en 0. ¿Se llamará al método? – Questions

+0

Cuando tienes 3 instancias del objeto en tu código, y haces un '[object1 release]' en (digamos) el primer objeto, todavía tienes 2 instancias dejados en otro lugar, por lo que aún no se llama. Deberá liberar * todas las instancias del objeto para que se llame a 'dealloc'. – BoltClock

+0

@Mark: ¿Estás pidiendo * "3 referencias a un objeto" * o * "3 objetos distintos" *? –

1

Como suponía, se llama cuando se destruye un objeto. El objeto debería liberar todo lo que posee.

0

En otras palabras, Dealloc libera/destruye/libera la memoria que asignó a sus objetos. Los objetos asignados a la memoria se deben destruir una vez que no se usen para evitar fugas de memoria que podrían hacer que la aplicación se bloquee.

ZaldzBugz