En mi pequeña aplicación para iPad tengo una función de "cambiar de idioma" que usa un observador. Cada controlador de vista se registra con mi observador durante su viewDidLoad:
.Desbloqueo personalizado y ARC (Objective-C)
- (void)viewDidLoad
{
[super viewDidLoad];
[observer registerObject:self];
}
Cuando el usuario pulsa el botón "Cambiar lenguaje", el nuevo idioma se almacena en mi modelo y el observador se notifica y pide un selector updateUi:
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, recupera los iconos de pestañas de sus controladores secundarios sin inicializar las vistas, por lo que no se llama al viewDidLoad:
, por lo que esos controladores de vista no reciben notificaciones de cambio de idioma. Debido a esto, moví mis llamadas registerObject:
al método init
.
Cuando usaba viewDidLoad:
para registrarme con mi observador, usé viewDidUnload:
para anular el registro. Como ahora me estoy registrando en init
, tiene mucho sentido anular el registro en dealloc
.
Pero aquí está mi problema. Cuando escribo:
- (void) dealloc
{
[observer unregisterObject:self];
[super dealloc];
}
consigo este error:
ARC forbids explicit message send of 'dealloc'
Desde necesito llamar [super dealloc]
para asegurar superclases limpian adecuadamente, pero prohíbe que ARC, ahora estoy atascado. ¿Hay alguna otra forma de informarte cuando mi objeto se está muriendo?
Como nota al margen - situación como esta puede causar una pérdida de memoria, que no se mostraría en la herramienta Fugas. Si el modelo de datos conserva la referencia al observador (que es lo predeterminado en ARC, incluso para ivars), nunca se llamará al dealloc, ya que el conteo de retenciones será mayor que cero. Por lo tanto, es posible que deba anular el registro manual del observador para permitir que se llame al dealloc en primer lugar. –
Implementé algo similar para las opciones de diestros y zurdos. El único VC que necesita el mensaje es el que se muestra actualmente. Otros miran el modelo en viewDidLoad o viewDidAppear para realizar cambios en la interfaz. Tal vez algo como esto funcionaría mejor. –
@BlazejCzapp ya que está utilizando un UITabBarController, y digamos que el UITabBarController siempre mantendrá una referencia al controlador registrado (como supongo que es el caso con sus controladores 'secundarios'), ¿la fuga de memoria seguirá siendo un problema? No veo cuándo se asignará el controlador registrado. Gracias – Objectif