En mi pequeña aplicación de iPad tengo una función de "cambio de idioma" que utiliza un observador. Cada controlador de vista se registra con mi observador durante su viewDidLoad:
.
- (void)viewDidLoad
{
[super viewDidLoad];
[observer registerObject:self];
}
Cuando el usuario presiona el botón "cambiar idioma", el nuevo idioma se almacena en mi modelo y se notifica al observador y llama a un updateUi:
selector en sus objetos registrados.
Esto funciona muy bien, excepto cuando tengo controladores de vista en un TabBarController. Esto se debe a que cuando se carga la barra de pestañas, obtiene los íconos de pestañas de sus controladores secundarios sin inicializar las vistas, por viewDidLoad:
lo que no se llama, por lo que esos controladores de vista no reciben notificaciones de cambio de idioma. Debido a esto, moví mis registerObject:
llamadas al init
método.
Cuando solía viewDidLoad:
registrarme con mi observador, solía viewDidUnload:
anular el registro. Como ahora me estoy registrando init
, tiene mucho sentido anular el registro dealloc
.
Pero éste es mi problema. Cuando yo escribo:
- (void) dealloc
{
[observer unregisterObject:self];
[super dealloc];
}
Me sale este error:
ARC prohíbe el envío explícito de mensajes de 'dealloc'
Como necesito llamar [super dealloc]
para asegurar que las superclases se limpien correctamente, pero ARC lo prohíbe, ahora estoy atascado. ¿Hay otra manera de informarme cuando mi objeto está muriendo?
Respuestas:
Cuando usa ARC, simplemente no llama
[super dealloc]
explícitamente: el compilador lo maneja por usted (como se describe en el documento Clang LLVM ARC, capítulo 7.1.2 ):fuente
dealloc
nunca se llama. ¿Tiene sentido llamar[observer unregisterObject:self]
a Dealloc? ¿Qué me estoy perdiendo?