objective c - libro - Dealloc personalizado y ARC(Objective-C)
objective c or swift (1)
Cuando usa ARC, simplemente no llama a [super dealloc]
explícitamente; el compilador lo maneja por usted (como se describe en el documento ARC LLVM ARC, capítulo 7.1.2 ):
- (void) dealloc
{
[observer unregisterObject:self];
// [super dealloc]; //(provided by the compiler)
}
En mi pequeña aplicación para 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 pulsa el botón "cambiar idioma", el nuevo idioma se almacena en mi modelo y se notifica al observador y llama a 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 la barra de pestañas se carga, recupera los iconos de pestañas de sus controladores secundarios sin inicializar las vistas, por lo que viewDidLoad:
no se llama, por lo que esos controladores de vista no reciben notificaciones de cambio de idioma. Debido a esto, moví mi registerObject:
llamadas al método init
.
Cuando usé viewDidLoad:
para registrarme con mi observador, usé viewDidUnload:
para viewDidUnload:
registro. Como ahora estoy registrándome en init
, tiene mucho sentido dealloc
registro en 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''
Ya que necesito llamar a [super dealloc]
para asegurar que las superclases se limpien adecuadamente, pero ARC prohíbe eso, ahora estoy atascado. ¿Hay otra manera de informarme cuando mi objeto se está muriendo?