Es necesario eliminar a sí mismo como delegado si su vida útil es más corta que el objeto que está delegada de. En casi todos los casos, su vida útil es igual o mayor que el objeto para el que está delegado. Dicho esto, es un buen hábito para entrar. Considere el caso en el que usted es el delegado de UITableView. En -init
, tal vez llame:
self.myTableView.delegate = self;
entonces sería potencialmente ser prudente en -dealloc
decir
_myTableView.delegate = nil;
[_myTableView release];
_myTableView = nil;
La razón para hacer esto es que myTableView puede ser retenido por otros objetos, por lo que no puede cancelar la asignación cuando lo liberas Si realiza una llamada de delegado después de que te hayas ido, tu aplicación se bloqueará. Así que borrar el puntero de delegado es una buena idea aquí.
Del mismo modo para NSNotificationCenter, debe darse de baja en -dealloc
así:
[[NSNotificationCenter defaultCenter] removeObserver:self];
Esto le elimina de todas las observaciones. Debería hacer esto en -dealloc si su clase alguna vez se registra para cualquier notificación. Si no lo haces y aparece una notificación que observabas luego de que te fuiste, la aplicación se bloqueará.
Esto no es necesario para los NSTimers porque los NSTimers retienen su objetivo (usted).
¡Gracias! Y ¿qué pasa con los eventos de UIControl? ¿Debo hacerlo [myButton removeTarget: ....]? – mk12
¿Y esto también se aplica a DataSources? – mk12
Para UIControl, es una pregunta interesante. No estoy seguro de si addTarget: ... conserva. Si no es así, entonces tienes razón, probablemente deberías retirarte. Las fuentes de datos son idénticas a los delegados. –