Tengo una vista (llamaremos a esta vista A) que tiene una propiedad weak
en su supervista (ver B). Ver la vista superior de A KVO, vista B. Dado que la referencia de la vista A para ver B es una propiedad débil (para evitar un ciclo de retención), ¿cómo puedo eliminar al observador (A observando a B)? Ver la referencia de A para ver B se anula antes de que tenga la oportunidad de eliminarlo.¿Cómo se elimina KVO de una propiedad débil?
A sobrevive B desde el controlador de vista tiene una fuerte referencia a A. Aquí está el mensaje de registro de fugas:
An instance 0x9ac5200 of class UITableView was deallocated while key value observers were still registered with it. Observation info was leaked, and may even become mistakenly attached to some other object. Set a breakpoint on NSKVODeallocateBreak to stop here in the debugger. Here's the current observation info:
<NSKeyValueObservationInfo 0x8660360> (
<NSKeyValueObservance 0x8660320: Observer: 0x8660020, Key path: contentOffset, Options: <New: YES, Old: NO, Prior: NO> Context: 0x8660020, Property: 0x864ac80>
)
B es un UITableView. Establecer un punto de interrupción en NSKVODeallocateBreak
produce resultados inútiles.
En A removeFromSuperview
, intento eliminar al observador pero la referencia de A a B ya es nil
.
Cambiando a unsafe_unretained
y hacer las cosas más manualmente o llamando al [A removeFromSuperview]
en la vista del controlador dealloc
resuelve el problema. Sin embargo, me gustaría saber cómo resolver esto usando una propiedad weak
.
Aquí está el código correspondiente: https://gist.github.com/2822776
My bad ... +1 de todos modos. – CodaFi