2009-08-21 16 views
5

En mi pregunta acerca del uso de un delegado o un Evento uicontrol, esto fue en la respuesta de Kendall Helmstetter Geln:iPhone dev - delegados, notificaciones, cancelar suscripción antes desasignado?

Ambos son alrededor de una carga igual a trabajar - con un delegado que tiene que fijarse y luego recuerde Deshacerse antes de ser desasignado. Debe hacer lo mismo con las notificaciones, recuerde comenzar a escuchar y luego darse de baja antes de ser desasignado.

¿Qué significan, darse de baja antes de desasignarse, desarmarse? No he estado haciendo lo que sea. ¿Podría alguien explicar por favor qué es y cómo hacerlo?

Gracias!

Respuesta

8

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

+1

¡Gracias! Y ¿qué pasa con los eventos de UIControl? ¿Debo hacerlo [myButton removeTarget: ....]? – mk12

+0

¿Y esto también se aplica a DataSources? – mk12

+0

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

1

Creo que simplemente configura el delegado en cero.

myOjectOrClass.delegate = nil; 
+0

Entonces, ¿tiene que hacer esto por cada delegado que asigne? ¿Qué pasa si no? ¿Qué pasa con los eventos (con [control addTarget: self action: ....)? – mk12

+0

¿Y cómo es que en mi libro y en el código de ejemplo nunca he visto esto? – mk12

+0

llegamos a lo mismo: configure delegate en nil antes de llamar al lanzamiento. –

1

No se realiza ninguna retención contra el destino cuando se pasa al método UIControl addTarget. Aunque la documentación no hace mención específica de esto, he escrito una prueba simple para probar este hecho.

Si agrega un objetivo como observador de un evento de control y luego lo suelta, notará que el conteo de retención disminuye (lo que puede resultar en que se recupere).

Esto significa que el control nunca evitará que el objetivo sea desasignado.

Cuestiones relacionadas